2017-07-26 26 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

相關問題