2

GUIでのスレッドの使用について質問したところ、次の応答がありました。

プログラムを作り直す必要があります。

  1. GUI要素は、スタンドアロンスレッドからではなく、GUIスレッド(EDT)内からのみ更新する必要があります。
  2. クライアント接続は、メッセージの送信と受信という2つの弱く接続された部分に分割する必要があります。受信は別のスレッドである必要があり、送信はスレッドまたはクラスにすることができます。
  3. 受信スレッドがメッセージを読み取ると、SwingUtilities.invokeLater(Runnable)を使用してメッセージをEDTに送信します。例は他の場所で見つけることができます。
  4. ユーザーがテキストを入力すると、テキストはソケットに直接送信されるか、キューに入れられ、後で送信スレッドによって処理されます(存在する場合)。

私が知りたいのは、EDTに対するJavaFxの応答とは何か、そしてそれを使用する方法の例を誰かに教えてもらえますか?

私の最初の投稿はこのリンクにありますスレッドの開始後にサーバー/クライアントプログラムが動作を停止します

  • 重要な場合は、javaFxSceneBuilderでGUIを構築したことに注意してください。
4

2 に答える 2

2

JavaFXで対応するSwingUtil.invokeLaterを探していますか。はいの場合、Platform.runLater(java.lang.Runnable runnable)です。

APIからの引用http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html

将来の不特定の時間に、JavaFXアプリケーションスレッドで指定されたRunnableを実行します。

于 2012-10-14T15:04:27.677 に答える
1

個人的には、タスクのrunメソッドをオーバーライドして、コアをビジー状態に保ち、ジョブを実行します。非視覚的なタスクは、Serviceクラスを拡張することによって実行されます。JavaFXアプリケーションスレッドは、サービスのすべてのメソッドと状態を呼び出すために排他的に使用されます。

サービスは、1つ以上のバックグラウンドスレッドでいくつかの作業を実行するために必要な情報をカプセル化する非ビジュアルコンポーネントです。

Taskは、FutureTaskの完全に監視可能な実装です。Tasksは、Workerインターフェースで定義されているように、JavaFXで非同期タスクをプログラミングするのに役立つ追加の状態と監視可能なプロパティを公開します。

メッセージの送信などの非UI計算は、タスクを実行することによって別のスレッドで実行する必要があります。JavaFXアプリケーションスレッド(EDTと同じ)からメッセージを受信したときにUIを変更(メッセージを表示)Platform.runLater(java.lang.Runnable runnable)できますが、UIが遅くなる可能性があるため、別のスレッドから集中的な処理を行うことをお勧めします。

したがって、タスクを定義し、を呼び出すことで新しいスレッドをトリガーできますnew Thread(task).start();。Task匿名クラスでは、メッセージの受信時にUIを更新するリスナーを追加できます。タスクには次のWorkerStateEventを含めることができ、それらをリッスンできます。

http://fxexperience.com/2011/07/worker-threading-in-javafx-2-0/のTaskを使用し、statePropertyリスナーを使用するサンプルコード。

Task task = new Task<Void>() {
    @Override public Void run() {
        static final int max = 1000000;
        for (int i=1; i<=max; i++) {
            updateProgress(i, max);
        }
        return null;
    }
};
ProgressBar bar = new ProgressBar();
bar.progressProperty().bind(task.progressProperty());
new Thread(task).start();

task.stateProperty().addListener(new ChangeListener<Worker.State>() {

        @Override
        public void changed(ObservableValue<? extends State> observable,
                State oldValue, Worker.State newState) {
            if(newState==Worker.State.SUCCEEDED){
                //doSomething()
            }
        }
    });
于 2012-10-14T06:44:10.423 に答える