In einer Swing-Anwendung habe ich mehrere Sub-Panels, von denen jedes einem einzelnen JSlider
. Das umgebende Eltern-Panel hört auch alle Unter-Panels ab. Um im folgenden Beispiel konsistente Ergebnisse zu erhalten, musste ich zuerst den Elternknoten und dann den lokalen Listener hinzufügen. Dies ist sinnvoll, wenn die Reihenfolge in EventListenerList
festgelegt ist und erklärt in diesem Artikel . Kann ich mich auf diese Bestellung verlassen oder sollte ich eine andere Veranstaltung organisieren?
Nachtrag: Die Diskussion in EventListenerList
erscheint eher eine Implementierungsberatung als eine Garantie sein. Der von pstanton vorgeschlagene Verkettungsansatz erzwingt die korrekte Reihenfolge zuverlässiger. Zum Beispiel kann das SubPanel
ChangeListener
das Ereignis einfach an das übergeordnete Element weiterleiten.
Da die Dokumentation für JSlider und JComponent usw. die Reihenfolge der Listenerbenachrichtigungen nicht erwähnt, würde ich zögern, mich darauf zu verlassen, zumindest ohne eingehende Tests für jede nachfolgende Version der JRE.
Wenn Sie sich wirklich auf die Reihenfolge verlassen müssen, sollten Sie eine Kette von Listenern einrichten, dh Listener one wird den Listener zwei usw. nennen.
Ein bisschen alt und sehr spät zu antworten. Aber mein instabiler Geist zwingt mich wirklich dazu, mich zu verarschen.
Kann ich mich auf diesen Auftrag verlassen oder sollte ich einen anderen schicken? Ereignis?
Ich glaube, dass sie die Reihenfolge einhalten, die Dokumentation der Komponente sagt uns nicht viel, aber Quellcode ist immer unser Freund. Beginnen wir mit addChangeListener(listener)
function von JSlider
:
SCHRITT 1: Der Aufruf von jSlider.addChangeListener(listener)
fügt listener
zu listener list
hinzu.
SCHRITT 2: Quellcode von EvenListenerList
: synchronized add(Class<T> t, T l)
: fügt die Listener und den entsprechenden Typ so hinzu, dass ein neuer Listener am Ende von Object[]
und für einen Index% co_de hinzugefügt wird %, i
ist der Typ des Listeners und Object[i]
ist die Listener-Instanz.
SCHRITT 3: Die Funktion Object[i+1]
von fireStateChanged()
ist verantwortlich für das Senden eines Ereignisses an jeden Listener der Liste. Der Quellcode sagt uns, dass er die JSlider
-Funktion jedes Listeners aufruft, indem er sie vom Ende der Listener-Liste aus besucht.
Zusammenfassung: Der Mechanismus des (synchronisierten) Hinzufügens und Besuchens von Listenern in der Listener-Liste zeigt uns, dass: der LAST ADD FIRST VISIT-Befehl beibehalten wird. Das heißt, der spätere (untergeordnete) hinzugefügte Listener wird zuerst aufgerufen, dann der vorherige (übergeordnete) hinzugefügte Listener und so weiter. Swing Ereignisbehandlungscode wird auf EDT ausgeführt. Und as stateChanged()
löst das Ereignis aus. In der gleichen Reihenfolge wie EventQueue
wird das untergeordnete Ereignis vor dem übergeordneten Ereignis ausgelöst.
Ich glaube also, dass die Reihenfolge beibehalten wird.
Tags und Links java swing event-listener