2016-10-04 5 views
0

私はJavaFXの新機能です。
私はいくつかのデータ値に基づいて外観を変えるいくつかのGUIコンポーネントを持っているアプリケーションに取り組んでいます。たとえば、3つの異なるデータの設定に基づいて色が変わる3つの信号が表示されている場合は、light1、light2、およびlight3と呼ぶことにします。このコンポーネントには、それに応じて色を更新するupdateColor(int data)という関数があります。JavaFXを使用して、GUIコンポーネントをどのようにデータにバインドしますか?

定期的にデータ値を取得し、light1、light2、およびlight3の値を更新する別のスレッド実行があります。

ここでは、別のスレッドがそれらの値を更新するとすぐに、表示されたコンポーネントが自動的に色を変更するようにしたいと思います。

私はバインディングについて読んだことがありますが、私が見た例のどれもこの状況に対処していないようです。いくつかの似たような例へのアイデアやポインターがあれば幸いです。

+0

[Java FXワーカースレッドでUIを常に更新]の可能な複製(http://stackoverflow.com/questions/20497845/constantly-update-ui-in-java-fx-worker-thread) – fabian

答えて

2

バックグラウンドスレッドで値が更新されている場合は、バックグラウンドスレッドでUIプロパティが更新されるため、UIコンポーネントのプロパティをバインドできません。シーングラフの一部であるノードのプロパティは、FXアプリケーションスレッドでのみ更新できます。

これを管理するイディオムは、プロパティにリスナーを登録し、UIを変更したときにPlatform.runLater(...)に更新することです。たとえば、と仮定すると、light1が、これはここで代替がバックグラウンドスレッドは、FXのアプリケーションスレッドのプロパティを更新できるようにすることです

light1.addListener((obs, oldValue, newValue) -> 
    Platform.runLater(() -> { 
     // update UI with newValue... 
    })); 

ようになり、いくつかのタイプTためProperty<T>のインスタンスです。すなわち、バックグラウンドスレッドは、Platform.runLater(...)を呼び出してプロパティを更新する。プロパティだけFXのアプリケーションスレッドに変更されているので次に、彼らにUIプロパティをバインドしても安全である:

// background thread code: 

public void run() { 

    // ... 

    // periodically update light1 on FX Application Thread: 
    Platform.runLater(() -> light1.set(...)); 

} 

、その後、あなたは

someUIElement.someProperty().bind(light1); 

(またはいくつかとlight1を交換を行うことができます結合は、light1に由来する)。

バックグラウンドサービスをJavaFXに統合するためのより一般的な戦略については、Adam Bienのexcellent articleを参照してください。

+0

ありがとう、それを見てみましょう。 –

+0

よくある問題の1つは、バックグラウンドスレッドがGUIについて知らないということです。外部ソースから値を取得してローカルに保存するだけです。 –

+0

わかりません。別のスレッドが「定期的にデータ値を取得し、light1、light2、およびlight3の値を更新する」と言っています。したがって、これらのプロパティを外部からアクセス可能にすると仮定すると、最初のソリューション( 'light1.addListener((...) - > Platform.runLater(...));)、' 'no?あるいは、Adamの記事でコールバックテクニックを使用することもできます。 –

関連する問題