[英]JavaFX show dialogue after thread task is completed
我需要顯示對話窗口
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();
我的線程完成任務后
Thread t = new Thread(new Runnable() {
@Override
public void run() {
doSomeStuff();
}
});
我試過了
Thread t = new Thread(new Runnable() {
@Override
public void run() {
doSomeStuff();
}
});
t.start();
t.join();
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();
}
但是直到doSomeStuff()
完成后,此應用程序才響應
t.join()
是一個阻塞調用,因此它將阻塞FX Application線程,直到后台線程完成。 這將防止重新粉刷UI或響應用戶輸入。
做您想做的最簡單的方法是使用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();
一種低級(即不使用JavaFX提供的高級API)方法是從后台線程安排對話框在FX Application線程上的顯示:
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();
我強烈建議您使用第一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.