S
splitshade
Gast
Hallo,
ich arbeite zur Zeit an einem Projekt, welches XML in Swing oder auch SWT-Layouts konvertiert.
Dies funktionioert soweit ganz gut, nur bin ich nun auf ein grösseres Problem gestossen, welches mich darauf schliessen lässt, dass in meiner Architektur ein grösserer Fehler vorliegt.
In dem XML-Framework gibt es eine Art globale Werte, auf die überall in der Applikation zugegriffen werden kann.
Jedes JComponent besitzt einen Listener, referenziert eines dieser JCOmponents einen dieser Values, wird der
Listener des Components dem GlobalValue zugewiesen.
Das funktioniert soweit wunderbar, nun ist der nächste Schritt, dass z.B. ein Textfeld beim Ändern automatisch
den Wert des globalen Values ändern soll.
Dafür hat nun wieder jeder Globale Value einen Listener, der dem referenzierenden Component zugewiesen wird.
Ändert man den Text des Textfeldes (wobei man hier nicht auf Textfelder beschränkt ist, sondern jede Art Component benutzen darf), wird der Wert des GlobalValues geändert, und die Listener des GlobalValue bekommen ein "valueChanged" Event.
Das Problem ist, dass nun das Component selbst über seine eigene Änderung benachrichtig wird, d.h. der GlobalValue
schickt das Event an alle Listener, das TextComponent erhält das Event, merkt, es hat sich etwas geändert, und schickt wiederum ein Event an den GlobalValue -> endlosschleife.. bzw eine IllegalArgumentException "Attempt to mutate in notification", da die Änderung innerhalb des DocumentListeners des Textfeldes vorgenommen wird.
Allgemein gefällt mir die doppelte Listener-Nutzung nicht, ich weiß aber auch nicht , wie man es besser machen kann, und lasse mich hier gerne belehren, ich hoffe auf konstruktive Vorschläge
Andy
ich arbeite zur Zeit an einem Projekt, welches XML in Swing oder auch SWT-Layouts konvertiert.
Dies funktionioert soweit ganz gut, nur bin ich nun auf ein grösseres Problem gestossen, welches mich darauf schliessen lässt, dass in meiner Architektur ein grösserer Fehler vorliegt.
In dem XML-Framework gibt es eine Art globale Werte, auf die überall in der Applikation zugegriffen werden kann.
Jedes JComponent besitzt einen Listener, referenziert eines dieser JCOmponents einen dieser Values, wird der
Listener des Components dem GlobalValue zugewiesen.
Das funktioniert soweit wunderbar, nun ist der nächste Schritt, dass z.B. ein Textfeld beim Ändern automatisch
den Wert des globalen Values ändern soll.
Dafür hat nun wieder jeder Globale Value einen Listener, der dem referenzierenden Component zugewiesen wird.
Ändert man den Text des Textfeldes (wobei man hier nicht auf Textfelder beschränkt ist, sondern jede Art Component benutzen darf), wird der Wert des GlobalValues geändert, und die Listener des GlobalValue bekommen ein "valueChanged" Event.
Das Problem ist, dass nun das Component selbst über seine eigene Änderung benachrichtig wird, d.h. der GlobalValue
schickt das Event an alle Listener, das TextComponent erhält das Event, merkt, es hat sich etwas geändert, und schickt wiederum ein Event an den GlobalValue -> endlosschleife.. bzw eine IllegalArgumentException "Attempt to mutate in notification", da die Änderung innerhalb des DocumentListeners des Textfeldes vorgenommen wird.
Allgemein gefällt mir die doppelte Listener-Nutzung nicht, ich weiß aber auch nicht , wie man es besser machen kann, und lasse mich hier gerne belehren, ich hoffe auf konstruktive Vorschläge
Andy