2017-07-26 29 views
0

我只是尝试显示加载动画,而我在我的代码访问ERP这样的:如何在javafx-application中显示加载动画?

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

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

可悲的动画从来没有像以前那样显示...只是结果。我尝试使用Platform.runLater,这产生了相同的结果。我还转移了线程中的最后2行,该线程正常工作(显示了动画),但当提交者试图写入我的消息字段时导致错误“不在FX应用程序线程中”。当我将线程传递给Platform.runLater时,它没有显示动画...我搜索了一下,但找不到解决方案。也许我失去了一些重要的...

我感谢任何帮助。谢谢!

+2

看看https://stackoverflow.com/questions/30249493/using-threads-to-make-database-requests帮助 –

回答

2

看起来好像你并没有完全理解UI线程是如何工作的。

您发布的代码是单线程的。它都在UI线程上运行。你添加一个风格类,做一些工作,然后删除它。问题是这个操作序列实际上是“原子”的:UI完全没有实际更新任何内容。这就是为什么你看不到加载符号改变的原因。

当你把所有这些放在runLater之内时,结果是一样的。它仍然在UI线程中。这里唯一的区别是,不是现在运行代码,而是延迟到“稍后”某个点(可能实际上很快)。

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

想要什么做的是运行在非UI线程一切,并推回UI操作界面线程与runLater。事情是这样的:

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

    submitImpl(); 

    Platform.runLater(()-> messageField.getStyleClass().remove("smallLoading")); 
}).start(); 
+0

感谢一大堆。那样做了。我误解了runLater的概念! –

+0

没问题。别客气。 – Michael

相关问题