线程任务完成后,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(); 

我强烈建议使用第一种方法。