Listener-Problematik in komplexem Projekt

Status
Nicht offen für weitere Antworten.
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
 
G

Guest

Gast
Du kannst es so organisieren, dass jede Komponente die eigenen Events ignoriert.
Code:
public class MyComponent extends ...
{
   ...
   public void handleEvent(IrgendeinEvent event)
   {
      // Eigene Events ignorieren
      if(event.getSource() == this)
         return;
      ...
   }
}
bzw.
public class MyComponent extends ...
{
   ...

   class MyEventHandler implements IrgendeinEventHandler
   {
      ...
      public void handleEvent(IrgendeinEvent event)
      {
         // Eigene Events ignorieren
         if(event.getSource() == MyComponent.this)
            return;
         ...
      }
   }
}
Noch eine Möglichkeit wäre, den Listener für die Dauer der Event-Bearbeitung
zu entfernen.
Code:
private void sendEvent(Event event)
{
   EvetHandler eventHandler = LocalContext.getInstance().getEventHandler();
   eventHandler.removeListener(this);
   eventHandler.sendEvent(event);
   eventHandler.addListener(this);
}
Das ganze setzt voraus, dass es bei dir so ähnlich aufgebaut ist. Begrenze den Scope von Events, indem
du eine Hierarchie von Kontexten aufbaust (Anwendungsglobal, Dialogkontext, Komponentenkontext etc.)
Jeder Kontext mit einem eigenen EventHandler usw.

Vielleicht bringt dich das auf paar Ideen. Dieses typische Observer-Observable Szenario ist bei grossen
Projekten eher ein Hindernis. Es entwickelt im Laufe der Zeit ein Eigenleben, das nur sehr schwer zu
debuggen ist.
 
S

splitshade

Gast
Das mit den Kontexten klingt interessant, kannst du das mal ein wenig erläutern, oder mir mal einen Begriff für dieses Konzept aus der Software-Entiwcklung nennen? damit habe ich mich noch nie beschäftigt, und google gibt auch nicht viel her, vielen Dank für die Antwort schonmal,
ich habe mir jetzt notdürftig damit beholfen, dass sich die Listener abmelden, wenn ein Notify von Ihnen ausgeht.
Das funktioniert, ist aber unschön.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
berserkerdq2 Was heißt es mit FXML Listener zu setzen ind Buttons zu erstellen? Allgemeine Java-Themen 6
L Wie programmiert man einen Listener? Allgemeine Java-Themen 1
S Threads Serielle Schnittstelle mit Listener / Aufrufendes GUI Allgemeine Java-Themen 4
H Listener Verständnisproblem Allgemeine Java-Themen 5
D Action Listener Problem Allgemeine Java-Themen 3
S Key Listener mit Strg + s Allgemeine Java-Themen 12
K Threads Listener für Future finish Allgemeine Java-Themen 2
TheWhiteShadow Listener Reihenfolge Allgemeine Java-Themen 4
D Listener auf System.out.err / System.out.println Allgemeine Java-Themen 5
A Listener für constructor einer bestimmen Klasse Allgemeine Java-Themen 9
E Bild mit Listener einfügen Allgemeine Java-Themen 3
P Listener für Tastatureingaben ohne Focus Allgemeine Java-Themen 4
serjoscha WatchDog Thread und Listener Allgemeine Java-Themen 10
hdi Listener für Desktop-Veränderungen Allgemeine Java-Themen 7
T JTextField in Listener leeren Allgemeine Java-Themen 2
lenniii Listener & JList Allgemeine Java-Themen 3
K Key listener ohne Fokus aktiv behalten ? Allgemeine Java-Themen 12
G Code-Convention für Listener Allgemeine Java-Themen 2
T Observer vs Listener Allgemeine Java-Themen 18
S Listener Allgemeine Java-Themen 3
P Abstrakte Elternklasse als Listener Allgemeine Java-Themen 6
MQue KeyAction listener Allgemeine Java-Themen 2
M generische Listener Allgemeine Java-Themen 2
S Listener für Kalender Allgemeine Java-Themen 2
B Observer vs Listener (GUI-Programmierung) Allgemeine Java-Themen 5
J Listener für Ende eines Threads gesucht... Allgemeine Java-Themen 5
S Listener Implentierung bei Eingabe in Textfeld Allgemeine Java-Themen 2
G Objekt einer inneren Klasse als Listener Allgemeine Java-Themen 3
D Boolean Listener? Allgemeine Java-Themen 28
M Listener und Performance Allgemeine Java-Themen 9
D Observer/Observable Pattern vs. Listener-Konzept Allgemeine Java-Themen 4
G Listener auf aktuelles Datum / Uhrzeit Allgemeine Java-Themen 2
Escorter Eigenen Listener schreiben Allgemeine Java-Themen 3
E Gibt es so etwas wie einen Windows Listener? Allgemeine Java-Themen 6
T SelectionProvider und Listener Frage Allgemeine Java-Themen 14
I Listener, der zeitlich-periodisch aufgerufen wird Allgemeine Java-Themen 3
R Generische Listener und Sender Allgemeine Java-Themen 12
B Listener dynamisch setzen Allgemeine Java-Themen 6
A Listener Tastatur Allgemeine Java-Themen 3
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
D Thread vs Listener Allgemeine Java-Themen 6
K Listener einem Objekt hinzufügen Allgemeine Java-Themen 3
I Listener/Event selber machen. Allgemeine Java-Themen 4
M Time Listener ? Allgemeine Java-Themen 2
Z Zwei Listener zwischen zwei Klassen Allgemeine Java-Themen 4
B statusbar update -> mit thread oder listener? Allgemeine Java-Themen 7
M Action-listener Allgemeine Java-Themen 6
M Bean Listener hinzufügen und Methode später überschreiben Allgemeine Java-Themen 27
G Flavor-Listener Allgemeine Java-Themen 6
E Listener für Änderung der Fenstergröße Allgemeine Java-Themen 3
W Listener an ein beliebiges Objekt hänger, der mir Änderung Allgemeine Java-Themen 8
Z Problem beim Aufruf eines Listener? Allgemeine Java-Themen 4
A HILFE: subclass von Hashtable mit listener aufstellen Allgemeine Java-Themen 5
reibi OtherWayAround - Problematik Allgemeine Java-Themen 3
G Thread- Problematik Allgemeine Java-Themen 4
G Regex Problematik Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben