I'd like to pause the execution of a method on the JavaFX application thread and wait until the user does interaction with the UI. It's important not to freeze the UI.
Example:
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());
How should I implement the pause()
and resume()
methods?
The execution of the event handler should wait at pause();
call until the user presses the resume
button and the resume
method is called.
You can do so by using Platform.enterNestedEventLoop
to pause the execution of the event handler and Platform.exitNestedEventLoop
(available since JavaFX 9) to resume the execution:
private final Object PAUSE_KEY = new Object();
private void pause() {
Platform.enterNestedEventLoop(PAUSE_KEY);
}
private void resume() {
Platform.exitNestedEventLoop(PAUSE_KEY, null);
}
Platform.enterNestedEventLoop
returns when Platform.exitNestedEventLoop
is called with the same parameter passed as first argument.
I am currently running JFX 8 where I have the similar feature in the Toolkit class.
Toolkit.getToolkit().enterNestedEventLoop(obj);
and
Toolkit.getToolkit().exitNestedEventLoop(obj);
Have not looked at the JFX 9 source, but my bet is that the Platform methods are simply shortcuts to the same.