如何在javafx-application中显示加载动画?

时间:2017-07-26 12:06:47

标签: java javafx

我只是尝试在我的代码中访问ERP时显示加载动画:

protected void submit()
{
    messageField.getStyleClass().add("smallLoading");

    submitImpl();
    messageField.getStyleClass().remove("smallLoading");
}

可悲的是,动画永远不会显示......就像以前一样。我尝试使用Platform.runLater,这产生了相同的结果。我还转移了一个Thread中的最后两行(有动画显示),但是当提交者试图写入我的消息字段时,导致错误“不在FX应用程序线程上”。当我将线程传递给Platform.runLater时,它没有显示动画......我用谷歌搜索了一下,但找不到解决方案。也许我错过了一些重要的事情......

我感谢任何帮助。谢谢!

1 个答案:

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