2017-09-09 6 views
-1

私は自分のアプリケーションを起動すると、ウィンドウの上にボタンをロード画面/クリック再生ボタンとして表示します。したがって、アプリケーションが起動すると、「読み込み中」と表示され、初期化メソッドでは無効に設定されます。私のコントローラは、4つのスレッドを使って物を計算する別のクラスをインスタンス化します。これは、ユーザーが読み込み中の画面を見ている間に持続すると考えられます。だから私のコントローラは、複数のスレッドを持つクラスへのコールバックとして機能するプライベートクラスをインスタンス化します。そのクラスがコンピューティングを終えると、コントローラは終了したことをコントローラにコールバックします。これが起こると、私は再びボタンを有効にして、ユーザーがそれをクリックして開始できるようにテキストを変更したいと思います。これは、コードの一部です:非GUIスレッドでJavaFX要素を変更するにはどうすればよいですか?

@FXML 
private Button btnStart; 

private final MuliThreadedClass treeBuilderStarter = new TreeBuilderStarter(board, new CBTreeDoneImpl()); 


    private class CBTreeDoneImpl implements CBThreadDone{ 

     @Override 
     public void done(ComplextObject obj) { 
      btnStart.setDisable(false); 
      btnStart.setText("Click to start!"); 
     } 
    } 

    @FXML 
    public void initialize() { 
     btnStart.setDisable(true); 
    } 

は今すぐコールバックが呼び出さと

btnStart.setDisable(false); 
    btnStart.setText("Click to start!"); 

されたとき、私はFXのスレッドでIllegalStateExceptionがないと言って例外を取得実行されます。私はこの問題を理解していますが、これを修正するにはどうしたらいいですか?

+0

直接呼び出し元のプラットフォームのないスレッドから[JavaFXの更新UIの可能性のある重複。 runLater](https://stackoverflow.com/questions/27309642/javafx-updating-ui-from-a-thread-without-direct-calling-platfo – Developer66

+0

最初にgoogleをしてください:https://stackoverflow.com/a/27316596/8087490 – Developer66

+0

いくつかのバックグラウンド作業が完了したときにあなたの 'done()'メソッドが実行されると仮定すると、 '' Task'](http://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html)を参照し、['succeeded()']をオーバーライドします(http://docs.oracle.com /javase/8/javafx/api/javafx/concurrent/Task.html#succeeded--)メソッドで、FXアプリケーションスレッドで実行されます。 –

答えて

2

FX以外のスレッドでGUIアクションを実行するには、Platform.runLater(Runnable)を使用する必要があります。


ドキュメント:Platform (JavaFX 8)

--- ---サンプル

Platform.runLater(new Runnable() { 
    @Override 
    public void run() { 
     // Do sth... 
    } 
}); 

または

Platform.runLater(() -> { 
    // Do sth... 
}); 
関連する問題