JavaFX Task / Thread / FXThread Komplikationen

Times

Bekanntes 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!?
 

Times

Bekanntes 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:

mrBrown

Super-Moderator
Mitarbeiter
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).
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.

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.

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

- Logik
- gui-update
- anhand der aktualisierten gui wieder "Logik"
- gui-update
- anhand der aktualisierten gui wieder "Logik"
Was davon ist denn zur GUI gehörende Logik?
 

Times

Bekanntes Mitglied
Hey, sorry für die verspätete Antwort.

Je länger man herumspielt desto mehr funktioniert dann auch, jedoch bin ich noch immer nicht 100%ig von FX überzeugt...

Warum sollte es nicht möglich sein, einen Thread ganz normal zu starten?
Wie bereits geschrieben, ist mir dies auch unklar. In der Konsole wird eine Exception geworfen, aber es läuft so wie es soll, aber das kann es ja auch nicht sein.
Die Exception (Bsp): Exception in thread "Thread-7" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-7

Ansonsten funktioniert das Programm im moment soweit. Musste einiges weiter umkapseln, und vorallem stört mich dieses ständige "Platform.runLater()" um allem was ich an der GUI ändere, auch wenn es von der GUI ausgelöst wurde. Sprich in einem ActionListener hinter einem Button.
Aber da ... bin ich ggf. noch ein wenig auf dem Holzweg.

Vieles ist denke ich gewöhnungsbedürftig, aber es gibt u.a. einen Punkt in FX der nach meinem Empfinden garnicht geht, unzwar das in FX 90% aller Methoden "final" sind, nur weil Oracle sagt, dass sie nicht möchten das die User weiter "kapseln", um so weniger Probleme mit BugFixes zu haben, wodurch dann ggf. die "gekapselten" - Klassen der User nicht mehr funktionieren.
Ich bin der Meinung das das dann das Problem vom User ist, denn klar.. wenn Fehler in den BasisKlassen gefunden werden, sollten diese behoben werden.. aber nun von Beginn an zu sagen das alles so verwenden muss wie vorgegeben ist, ist nicht das was ich erwartet habe.

Letzlich werde ich mich doch überwinden müssen und mit FX richtig durchstarten, aber so richtigige Begeisterung ist im moment (vielleicht ändert sich dies ja noch .. die Zeit heilt alle Wunden xD) nicht gegeben.

Nichtsdestotrotz, vielen Dank für die Hilfe und bis demnächst :)
 

mrBrown

Super-Moderator
Mitarbeiter
Wie bereits geschrieben, ist mir dies auch unklar. In der Konsole wird eine Exception geworfen, aber es läuft so wie es soll, aber das kann es ja auch nicht sein.
Die Exception (Bsp): Exception in thread "Thread-7" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-7
Das liegt daran, das GUI-Änderungen im FX-Thread stattfinden müssen, erwähnst du ja selbst auch ;)

Ansonsten funktioniert das Programm im moment soweit. Musste einiges weiter umkapseln, und vorallem stört mich dieses ständige "Platform.runLater()" um allem was ich an der GUI ändere, auch wenn es von der GUI ausgelöst wurde. Sprich in einem ActionListener hinter einem Button.
Das ist bei jedem GUI-Framework so.
Änderungen, die von Events der GUI ausgelöst werden, brauchen das btw nicht, die laufen ja schon im passenden Thread.
Meist hält sich das aber auch in Grenzen und reduziert sich auf einige wenige Methoden, mit Lambdas ists ja auch nicht so viel Bloat.

Vieles ist denke ich gewöhnungsbedürftig, aber es gibt u.a. einen Punkt in FX der nach meinem Empfinden garnicht geht, unzwar das in FX 90% aller Methoden "final" sind, nur weil Oracle sagt, dass sie nicht möchten das die User weiter "kapseln", um so weniger Probleme mit BugFixes zu haben, wodurch dann ggf. die "gekapselten" - Klassen der User nicht mehr funktionieren.
Ich bin der Meinung das das dann das Problem vom User ist, denn klar.. wenn Fehler in den BasisKlassen gefunden werden, sollten diese behoben werden.. aber nun von Beginn an zu sagen das alles so verwenden muss wie vorgegeben ist, ist nicht das was ich erwartet habe.
Ehrlich gesagt versteh ich nicht was du meinst?
Das ist nicht sonderlich unüblich, das so zu programmieren - eben das ist doch Kapselung - man verhindert nur das Aufbrechen derer.

Wo fehlt dir denn Erweiterbarkeit?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
ralfb1105 JavaFX HTTP Download task im Hintergrund innerhalb GUI AWT, Swing, JavaFX & SWT 70
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
ralfb1105 JavaFX ProgressIndicator Meldung wenn Task failed AWT, Swing, JavaFX & SWT 5
I JavaFX Im Controller die ProgressBar mit Task updaten AWT, Swing, JavaFX & SWT 6
F JavaFX JavaFX - Hintergrundmusik in einem seperatem Task/Service AWT, Swing, JavaFX & SWT 6
A JavaFX Eine Task mit einer ProgressBar verbinden AWT, Swing, JavaFX & SWT 0
G Task in Taskbar blinken lassen AWT, Swing, JavaFX & SWT 3
V JDialog "verschwindet" beim umschalten in der Task AWT, Swing, JavaFX & SWT 9
T Programm gleich wie Windows Media Player in den Task geben AWT, Swing, JavaFX & SWT 10
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread per Button starten AWT, Swing, JavaFX & SWT 10
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben