JavaFX 在线程任务完成后显示对话

标签 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();   

我的线程完成任务后

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 应用程序线程,直到后台线程完成。这将阻止 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 应用程序线程上对话框的显示:

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();

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

关于JavaFX 在线程任务完成后显示对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58500133/

相关文章:

java - 如何使用ctiteria API spring data JPA规范定义多个Join on条件?

multithreading - GHC 每线程 GC 策略

c++ - 在 C++ OpenMP 中为每个线程定义一个优先级队列

java - 死代码警告

java - kafka java 客户端不消费 - 只是卡在 consumer.poll

multithreading - 接收器在尝试通过 channel 发送时关闭并返回 SendError

FXML 中的 Javafx 圆环图

javafx:为 GridPane 中的标签设置不同的节点方向

java - JavaFX WebView 中的 Html/Javascript 调试

java - 单击事件后从资源布局中 inflatedView