2017-09-22 8 views
3

JavaFXアプリケーションスレッドでメソッドの実行を一時停止し、ユーザーがUIとやりとりするまで待機したいと思います。 UIをフリーズしないことが重要です。showAndWaitを使用せずにJavaFXアプリケーションスレッドのユーザー入力を待つ方法

例:

Button start = ... 
Button resume = ... 

start.setOnAction(evt -> { 
    System.out.println("starting"); 
    start.setDisable(true); 
    System.out.println("please press resume button."); 
    pause(); 
    System.out.println("done"); 
    start.setDisable(false); 
}); 

resume.setOnAction(evt -> resume()); 

どのように私はpause()resume()メソッドを実装する必要がありますか?
イベントハンドラの実行は、ユーザがresumeボタンを押してresumeメソッドを呼び出すまでpause();コールを待機する必要があります。

+0

メソッド実行中に「一時停止」することは本当に必要ですか? 'pause()'を呼び出す代わりにメソッドを終了し、残りの作業はレジュームボタンのアクションハンドラで行います。 – isnot2bad

答えて

2

あなたは、実行を再開するためにイベント・ハンドラと(JavaFXの9以降で利用可能)Platform.exitNestedEventLoopの実行を一時停止するPlatform.enterNestedEventLoopを使用して行うことができます:Platform.exitNestedEventLoopが渡され、同じパラメータで呼び出されたとき

private final Object PAUSE_KEY = new Object(); 

private void pause() { 
    Platform.enterNestedEventLoop(PAUSE_KEY); 
} 

private void resume() { 
    Platform.exitNestedEventLoop(PAUSE_KEY, null); 
} 

Platform.enterNestedEventLoopリターンを最初の議論として。

+0

'Platform.enterNestedEventLoop'は冪等であるか、あるいは呼び出しが累積されていますか?具体的には、 'Platform.enterNestedEventLoop(...)'が呼び出され、同じパラメータでネストされたループから呼び出された場合、(同じパラメータを持つ) 'Platform.exitNestedEventLoop'への最初の呼び出しが両方のブロックを解放するか、ネストされたイベントループ内のブロックのみを解放します(元のブロックを解放するために2回目の呼び出しが必要です)。 –

+1

@James_Dネストされたループが終了する前に、同じキーを 'enterNestedEventLoop'で複数回使用することはできません。 [javadoc:* IllegalArgumentException - 指定されたキーがまだ返されていないネストされたイベントループに関連付けられているかどうかを確認する*](http://download.java.net/java/jdk9)を試してみると、 'IllegalArgumentException'がスローされます。 /jfxdocs/javafx/application/Platform.html#enterNestedEventLoop-java.lang.Object-) – fabian

+0

Java9の前ですか? :) – user1803551

関連する問題