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