Mar*_*aya 6 java multithreading javafx
我需要显示对话窗口
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();
Run Code Online (Sandbox Code Playgroud)
在我的线程完成任务之后
Thread t = new Thread(new Runnable() {
@Override
public void run() {
doSomeStuff();
}
});
Run Code Online (Sandbox Code Playgroud)
我试过了
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();
}
Run Code Online (Sandbox Code Playgroud)
但这个应用程序没有响应,直到doSomeStuff()
完成
Jam*_*s_D 13
t.join()
是一个阻塞调用,因此它将阻止FX应用程序线程,直到后台线程完成.这将阻止重新绘制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();
Run Code Online (Sandbox Code Playgroud)
低级(即不使用高级API JavaFX提供)方法是从后台线程安排FX应用程序线程上的对话框显示:
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();
Run Code Online (Sandbox Code Playgroud)
我强烈建议使用第一种方法.