JavaFX Task / Thread / FXThread Komplikationen

Diskutiere Task / Thread / FXThread Komplikationen im AWT, Swing, JavaFX & SWT Forum; Hallo, ich bin gerade dabei eine Swing-Anwendung neu nach FX zu übersetzten und stoße immer wieder auf einige Nickligkeiten bei denen ich am...

  1. Times
    Times Mitglied
    Hallo,

    ich bin gerade dabei eine Swing-Anwendung neu nach FX zu übersetzten und stoße immer wieder auf einige Nickligkeiten bei denen ich am liebsten in meinen Bildschirm schlagen würde, doch dann erkennt man immer wieder das es doch irgendwie geht :)
    So bitte ich nun um eure Hilfe.

    Ich habe 5 Listen die aufeinander aufbauen. Sprich die Daten der 5. Liste sind abhängig von dem was in der 4. Liste ausgewählt wurde, dessen wiederrum abhängig sind von den Daten den 3. Liste etc.
    Im Normalfall wählt der Benutzer also einen Eintrag aus der 1. Liste aus, und dann aktualisiert sich die 2., danach wählt er einen Eintrag der 2. Liste aus, woraufhin sich die 3. Liste ausfüllt etc.

    Es gibt aber auch einen anderen Fall, in welchem diese Operationen vom Code aus aufgerufen werden, sprich der Benutzer hat die Möglichkeit anhand von vorgefertigten Templates diese Auswahl vom Programm treffen zu lassen.

    In Swing war das ganze wie folgt realisiert:
    PseudoCode:
    Thread{
    1. Befülle die erste Liste (Das was hier geladen wird, ist zudem für jede KonfigurationsID im Template ebenfalls unterschiedlich).
    2. Selektiere den Eintrag der 1. Liste, so wie dieser im Template steht.
    3. Durch die vorherige Selektierung wurde automatisch das SelectionEvent ausgeführt, sprich die 2. Liste wurde ausgefüllt.
    4. Selektiere den Eintrag der 2. Liste, so wie dieser im Template steht.
    ....
    ....
    ....
    }.start

    Der Grundaufbau in FX sieht bei mir ähnlich aus. Ein erster Unterschied ist erstmal das ich den Thread so nicht starten konnte, also habe ich die ganze Aktion in eine Task gekapselt, welche dem Thread übergeben wird.

    Dann habe ich gelesen, das ich in FX GUI-Änderungen nur durch den FX-Thread durchführen kann, sprich alle GUI-Änderungen mit einem Platform.runLater() umkapsle... und genau da liegt mein Problem. Wie die Methode schon sagt wird es erst später (later) ausgeführt.. da FX ja SingleThreaded ist (Ist richtig oder? Fällt mir gerade ein bisschen schwer da ich auf der Arbeit mit Swing arbeiten muss, mich aber nun privat vermehrt mit FX beschäftigen will und daher das ein oder andere durcheinander werfe).
    Und wenn es erst "später" ausgeführt wird, kann ich ja nicht in der nächsten Zeile direkt einen Eintrag dieser Liste selektieren und weiter fortfahren. Dazu würde mir nur einfallen ein neues Event in dem runLater zu triggern, woraufhin dann der 1. Listereintrag selektiert, und die 2. Liste ausgefüllt wird, beim runLater() zum befüllten der 2. Liste dann wieder ein Event triggere für die 3. Liste usw. Ist das wirklich so gewollt, oder bin ich da auf dem dem Holzweg?

    --------------------------------------------------------------------------------------------
    Folglich eine andere Frage zu diesem Thema:
    Ich habe anfangs.. einfach mal die ganzen Platform.runLater() für die GUI-Änderungen weggelassen und .. so würde es einwandfrei funktionieren. Nunja was heisst einwandfrei.. es kommen endlos viele Exceptions in der Konsole, bzgl.:
    Exception in thread "Thread-7" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-7

    Ich möchte dies auf keinen Fall so durchführen, aber meine Frage wäre dann doch wieso das denn geht.. würde man die Fehler weglassen, würde sich das ganze so verhalten wie bei Swing?!

    Bzgl. des 2. Punktes ist es denke ein Unverständnis meiner seits (Ich hoffe) .. aber am 1. Punkt muss doch was machbar sein oder nicht? Eine Lösung, bei welcher ich nicht alles immer weiter Kapseln muss!?
     
  2. Vielleicht hilft dir dieser Java-Kurs hier weiter --> (hier klicken)
  3. Nuiton
    Nuiton Mitglied
    Hilft dir das vielleicht?
     
    Times gefällt das.
  4. Times
    Times Mitglied
    Im Grunde war das mein Start in das ganze. So bin ich auf auf das ganze mit dem Task gekommen, aber letzlich hat es mir bisher nicht so richtig weitergeholfen, denn dort stoße ich auch immer wieder auf das Platform.runLater, sobald ich die GUI verändern möchte.

    Ich möchte:
    - Logik
    - gui-update
    - anhand der aktualisierten gui wieder "Logik"
    - gui-update
    - anhand der aktualisierten gui wieder "Logik"

    Je länger ich darüber nachdenke ist es aber auch ein Punkt der vermutlich nicht in FX funktioniert, denn FX soll ja eben die GUI von der Logik trennen, aber in Swing hatte ich (bisher auch erst diesen einen Fall) wo die Logik direkt mit der GUI zusammenspielt.
    Ich denke das ich meinen Ansatz überdenken muss, und mir weiter einhämmern muss das ich diese Dinge voneinander strikt trenne. Also erst Logik, dann GUI-Update.

    Zu der Seite die zu gepostet hast.. das einzige was ich dort immer wieder finde ist wie ich das ganze Handling mit der ProgressBar abarbeite, aber dazu sind bereits Methoden in der Task Klasse für vorgesehen die einem die ganze Arbeit da abnehmen.

    Ich werde noch eine Nacht drüber schlafen. Beim schreiben von solchen Dingen scheint alles aufeinmal einen Sinn zu ergeben... ^.^

    Edit: Noch ist die Nacht nicht um, aber mich hat etwas beschäftigt.
    Im Grunde ist die manuelle Funktionalität so umgesetzt wie es sein soll.
    Der Benutzer wählt etwas aus > Logik > GUI-Update.

    In der zusätzlichen Funktion möchte ich ja nur diese Unterroutinen alle unmittelbar nacheinander aufrufen, aber statt in den Unterroutinen die selektieren Werte zu übermitteln, habe ich es nun so umgebaut das ich diese direkt via Parameter uebergebe und somit an dieser Stelle nicht auf die aktualisierte GUI angewiesen zu sein.

    Fazit: Es funktioniert so wie gewünscht. Ich schätze ich muss mir meine Arbeiten da genauer ansehen und doch ein wenig Hirnschmalz mehr reinstecken, wie bei Swing. Also nicht alles Brainless runterprogrammieren..
    Warum jedoch das was ich im oberen Beitrag unter der Trennlinie geschrieben habe funktioniert ist mir im moment noch unklar.
     
    Zuletzt bearbeitet: 12. Okt. 2017
  5. mrBrown
    mrBrown Bekanntes Mitglied
    Warum sollte es nicht möglich sein, einen Thread ganz normal zu starten?

    Das Änderung nur im jeweiligen GUI-Thread stattfinden dürfen, ist bei Swing übrigens nicht anders.

    Sollte man in Swing auch, das ist ein generelles Konzept.

    Was davon ist denn zur GUI gehörende Logik?
     
Die Seite wird geladen...

Task / Thread / FXThread Komplikationen - Ähnliche Themen

Multithreading: Service(Task), wait und continue
Multithreading: Service(Task), wait und continue im Forum Allgemeine Java-Themen
Verständnis frage zu Threads//AsyncTasks
Verständnis frage zu Threads//AsyncTasks im Forum Mobile Geräte
Main Thread warten auf abgebrochen Task warten lassen
Main Thread warten auf abgebrochen Task warten lassen im Forum Allgemeine Java-Themen
Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern?
Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? im Forum Allgemeine Java-Themen
Mehrfache Ausführung desselben Threads/Tasks verhindern?
Mehrfache Ausführung desselben Threads/Tasks verhindern? im Forum Allgemeine Java-Themen
Thema: Task / Thread / FXThread Komplikationen