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

Nil*_*mat 1 java javafx

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

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

    submitImpl();
    messageField.getStyleClass().remove("smallLoading");
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,动画从未显示过……只是以前的结果。我尝试使用Platform.runLater,产生了相同的结果。我还传输了工作线程中的最后两行,该行有效(显示了动画),但是当提交者尝试写入我的消息字段时,导致错误“不在FX应用程序线程上”。当我将Thread传递给Platform.runLater它时,它没有显示动画……我用Google搜索了一下,但找不到解决方案。也许我错过了一些重要的事情...

感谢您的帮助。谢谢!

Mic*_*ael 7

似乎您不太真正了解UI线程的工作原理。

您发布的代码是单线程的。所有这些都在UI线程上运行。您添加一个样式类,做一些工作,然后将其删除。问题在于此操作序列实际上是“原子的”:UI直到完成所有操作才真正更新任何内容。这就是为什么看不到加载符号变化的原因。

当您将所有这些放入runLater结果中时,结果是相同的。它仍然全部在UI线程上。唯一的区别是,您现在将其推迟到“以后”(可能实际上很快),而不是现在运行代码。

当您尝试将最后两行放在单独的线程中时,问题是您试图在非UI线程上进行UI更改。那是不允许的。

想要做的是在非UI线程上运行所有内容,然后使用将UI操作推回UI线程runLater。像这样:

new Thread(() -> {
    Platform.runLater(()-> messageField.getStyleClass().add("smallLoading"));

    submitImpl();

    Platform.runLater(()-> messageField.getStyleClass().remove("smallLoading"));
}).start();
Run Code Online (Sandbox Code Playgroud)