我只是尝试在我的代码中访问ERP时显示加载动画:
protected void submit()
{
messageField.getStyleClass().add("smallLoading");
submitImpl();
messageField.getStyleClass().remove("smallLoading");
}
可悲的是,动画永远不会显示......就像以前一样。我尝试使用Platform.runLater
,这产生了相同的结果。我还转移了一个Thread中的最后两行(有动画显示),但是当提交者试图写入我的消息字段时,导致错误“不在FX应用程序线程上”。当我将线程传递给Platform.runLater
时,它没有显示动画......我用谷歌搜索了一下,但找不到解决方案。也许我错过了一些重要的事情......
我感谢任何帮助。谢谢!
答案 0 :(得分:4)
您似乎并不完全了解UI线程的工作原理。
您发布的代码是单线程的。它都在UI线程上运行。你添加一个样式类,做一些工作,然后删除它。问题在于,这一系列操作实际上是“原子性的”:在完成任务之前,UI实际上并没有更新任何内容。这就是您没有看到加载符号更改的原因。
当你把所有这些都放在runLater
中时,结果是一样的。它仍然在UI线程上。这里唯一的区别是,不是现在运行代码,而是将它推迟到某个时间点,然后再#34; (可能实际上很快)。
当您尝试将最后两行放在单独的线程中时,问题是您尝试在非UI线程上进行UI更改。这是不允许的。
您希望做的是在非UI线程上运行所有,并使用runLater
将UI操作推回到UI线程。像这样:
new Thread(() -> {
Platform.runLater(()-> messageField.getStyleClass().add("smallLoading"));
submitImpl();
Platform.runLater(()-> messageField.getStyleClass().remove("smallLoading"));
}).start();