2017-09-22 5 views
-1

JavaFXアプリケーションスレッド。私が見つけることができるソースは、このスレッドでノード上のすべての更新が行われなければならないと言います。アプリケーションスレッド外のJavaFXライブノードの更新

私はこの文書を見つけようとしていますが、この規則に例外があるとします。 https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm それが言うように:

JavaFXアプリケーションのグラフィカル・ユーザ・インタフェースを表すのJavaFXシーングラフは、スレッドセーフではなく、唯一のものJavaFXとして知られているUIスレッドからアクセスされ、変更することができアプリケーションスレッド。

https://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm#A1107438

ウィンドウの一部であるシーンでどれ「ライブ」のシーンは、このスレッドからアクセスする必要があります。シーングラフはバックグラウンドスレッドで作成および操作できますが、そのルートノードがシーン内の任意のライブオブジェクトにアタッチされている場合、そのシーングラフにはJavaFXアプリケーションスレッドからアクセスする必要があります。

ノード上のすべての更新をJavaFX ATで実行する必要がないことがありました。ノードを更新するための呼び出しの中には、このスレッド外で正常に動作するものがあります。 たとえば、text textPropertyを更新する場合、JavaFX AT内で実行する必要はありません。したがって、ツールヒントの設定や可視性の変更/無効化/管理のようには見えません。 JavaFXのATの外

アップデートレーベルtextPropertyは

IllegalStateExceptionがスローされます:ないFXのアプリケーションスレッドに、 currentThread = Task

答えて

2

あなたは何が例外をスローすることで許可されていないのか混乱させます。単に何かが例外を投げていないということは、それが許可されていること、あるいは安全であること、または動作することが保証されていることを意味するものではありません。

ライブシーングラフの一部であるノードのすべての変更は、JavaFXアプリケーションスレッドでになる必要があります。

このルールに違反した場合、JavaFXは例外をスローするために最善の努力をします。スレッドコストのチェックに時間がかかり、一部の操作ではスレッドをチェックするパフォーマンスコストが高すぎるため、ルールの違反がすべて例外になるわけではありません。ただし、例外をスローしなくても、ルール違反は将来の任意の時点で不一致になりがちです。実際に起こっている例については、Moving circle randomly disappears (javafx)を参照してください。

+0

ご清聴ありがとうございます。それは動作する可能性があるが、予測できないエラーがあることを述べているSwingのドキュメント。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html JavaFXの免責条項はありません.FXアプリケーション・スレッドで実行する必要があります。 – DJViking

+0

@DJVikingそれはシングルスレッドだと言います。ツールキットを使用しているプログラマが、複数のスレッドにわたって単一スレッドAPIを使用することの結果を理解していると仮定するのはおそらく合理的です。 –

関連する問題