gpt4 book ai didi

JavaFX 和 GUI 线程 : Change button text from Thread

转载 作者:行者123 更新时间:2023-11-29 03:08:27 28 4
gpt4 key购买 nike

我有一个带有 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com