JavaFX 和 GUI 线程 : Change button text from Thread

标签 java multithreading user-interface

我有一个带有 TextArea 和保存按钮的 GUI。当我按下后者时,文本被保存。这大约需要 2 秒。在保存过程中,按钮应该比保存之前和之后得到另一个标题。

这是我的代码:

    saveButton.setText("Saving...");
    Util.print("Saving...");

    Thread saveIt = new Thread(new Runnable() {
        @Override public void run() {
            Platform.runLater(() -> {
                try {
                    Thread.sleep(2000);
                } catch (Exception ex) {
                    Util.print(ex);
                }
                saveButton.setText("Saved!");
                Util.print("Saved!");
            });
        }
    });
    saveIt.setDaemon(true);
    saveIt.start();

会发生什么:

按下按钮后在命令行上产生以下输出:

Saving...
Saved!

在我点击 saveButton 后,命令行直接打印“Saving...”。按下 saveButton 2 秒后,命令行打印“已保存!”并且按钮标题变为“已保存!”。

我的期望:

在我点击保存按钮后,命令行输出和按钮标题直接显示“正在保存...”。 2 秒后,标题变为“已保存!”。

我怎样才能实现预期的行为?

非常感谢您的帮助。

P.S.:我知道很多人在从 Threads 更改 GUI 元素时遇到过问题。我已经在 StackOverflow 和网络上阅读了一些关于它的文章,但这篇文章对我来说太难了。仅供引用,以下是我迄今为止尝试过的一些事情,其中​​包括任务:

Constantly Update UI in Java FX worker thread

Why am I getting java.lang.IllegalStateException "Not on FX application thread" on JavaFX?

javafx, update ui from another thread

http://blog.axxg.de/javafx-ui-thread-update/

最佳答案

我不得不将 Thread.sleep() 部分放在 Platform.runLater() 进程之外。貌似 runLater() 必须尽可能少的工作量。

Platform.runLater(() -> {
    saveButton.setText("Saving...");
    Util.print("Saving...");
});


Thread saveIt = new Thread(new Runnable() {
    @Override public void run() {
        try {
            sleep(2000);
        } catch (Exception ex) {
            Util.print(ex);
        }
        Platform.runLater(() -> {
            saveButton.setText("Saved!");
            Util.print("Saved!");
        });
    }
});
saveIt.setDaemon(true);
saveIt.start();

关于JavaFX 和 GUI 线程 : Change button text from Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783299/

相关文章:

java - 从 EditText 中的共享首选项加载字符串(两个类)

c# - sleep /等待很长时间

c# - 将 Ping 应用程序转换为多线程版本以提高速度 - C#

c++ - Qt 对象/类到 Qt ui 文件

ios - 如何获取 Sprite Kit 中 UI 触摸的位置?

java - 自动生成类内的变量值

java - SpEL - 错误 : Method cannot be found on type

java - 使用 3 个不同线程中的套接字监听 3 个不同的端口

android - 创建删除线文本?

java - 我可以在 Java 中使用 resultset.getBoolean 在 SQL 中获取 Tinyint