2017-07-26 1 views
0

Ich versuche einfach, eine Lade-Animation zu zeigen, während ich ein ERP in meinem Code wie folgt zugreifen:Wie zeige ich eine Lade-Animation in javafx-application?

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

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

Leider ist die Animation wird nie wie vorher ... einfach das Ergebnis ausgewiesen. Ich versuchte mit Platform.runLater, die das gleiche Ergebnis ergab. Ich habe auch die letzten 2 Zeilen in einem Thread übertragen, was funktionierte (die Animation wurde gezeigt), aber zu dem Fehler "Nicht im FX-Anwendungs-Thread" führte, als der Submitter versuchte, in mein Nachrichtenfeld zu schreiben. Als ich den Thread an Platform.runLater übergab, zeigte es die Animation nicht ... Ich googelte ein wenig, aber konnte keine Lösung finden. Vielleicht vermisse ich etwas wichtiges ...

Ich schätze jede Hilfe. Vielen Dank!

+2

Sehen Sie, wenn https://stackoverflow.com/questions/30249493/using-threads-to-make-database-requests –

Antwort

2

Es scheint, als ob Sie nicht wirklich vollständig verstehen, wie der UI-Thread funktioniert.

Der Code, den Sie gepostet haben, ist single-threaded. Alles funktioniert auf dem UI-Thread. Sie fügen eine Stilklasse hinzu, machen etwas Arbeit und entfernen sie dann. Das Problem ist, dass diese Abfolge von Operationen tatsächlich "atomar" ist: Die Benutzeroberfläche aktualisiert nichts, bis alles fertig ist. Aus diesem Grund ändert sich das Ladesymbol nicht.

Wenn Sie alles innerhalb runLater setzen, ist das Ergebnis das gleiche. Es ist immer noch alles auf dem UIhread. Der einzige Unterschied besteht darin, dass Sie den Code jetzt nicht mehr ausführen, sondern bis zu einem gewissen Punkt "später" (wahrscheinlich sogar sehr bald) verschieben.

Wenn Sie versuchen, die letzten beiden Zeilen in einen separaten Thread einzufügen, besteht das Problem, dass Sie versuchen, Benutzeroberflächenänderungen an einem Nicht-UI-Thread vorzunehmen. Das ist nicht erlaubt.

Was Sie wollen alles laufen zu tun ist auf einem Nicht-UI-Thread, und drücken Sie die UI-Operationen auf dem UI-Thread wieder mit runLater. Etwas wie folgt aus:

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

    submitImpl(); 

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

Dank einem Haufen hilft. Das hat es getan. Ich habe das Konzept von runLater missverstanden! –

+0

Kein Problem. Bitte. – Michael

Verwandte Themen