我有一个带有 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?
最佳答案
我不得不将 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/