线程任务完成后,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();
在我的线程完成任务之后
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 task = new Task () { @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();
低级(即不使用高级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();
我强烈建议使用第一种方法。