t.join()
is a blocking call, so it will block the FX Application thread until the background thread completes. This will prevent the UI from being repainted, or from responding to user input.
The easiest way to do what you want is to use a Task
:
Task<Void> task = new Task<Void>() {
@Override
public Void call() throws Exception {
doSomeStuff();
return null ;
}
};
task.setOnSucceeded(e -> {
Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
Scene scene = new Scene(new Group(new Text(25, 25, "All is done!")));
dialog.setScene(scene);
dialog.showAndWait();
});
new Thread(task).start();
A low-level (i.e. without using the high-level API JavaFX provides) approach is to schedule the display of the dialog on the FX Application thread, from the background thread:
Thread t = new Thread(() -> {
doSomeStuff();
Platform.runLater(() -> {
Stage dialog = new Stage();
dialog.initStyle(StageStyle.UTILITY);
Scene scene = new Scene(new Group(new Text(25, 25, "All is done!")));
dialog.setScene(scene);
dialog.showAndWait();
});
});
t.start();
I strongly recommend using the first approach.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…