2017-07-26 14 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スレッド上にあります。ここでの唯一の違いは、コードを実行するのではなく、後で(おそらく実際はまもなく)ある時点まで延期することです。

最後の2行を別のスレッドに入れようとすると、UI以外のスレッドでUIを変更しようとしているという問題があります。それは許可されていません。

あなたはがやりたいは非UIスレッドですべてを実行し、runLaterとUIスレッドにUI操作をプッシュバックされます。このような何か:

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

    submitImpl(); 

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

おかげでたくさんの場合に役立ちます参照してください。それがそれでした。私はrunLaterのコンセプトを誤解しました! –

+0

問題ありません。どういたしまして。 – Michael

関連する問題