EventListenerList vs. ArrayList

Status
Nicht offen für weitere Antworten.

KrokoDiehl

Top Contributor
Morgen zusammen.

Ich habe nun schon ein paar GUI-Komponenten hinter mir, bei denen ich die Verwaltung von Event-Listener machen musste. Z.B. wenn man das TableModel implementiert, hat man auch die Methoden
Code:
add
- und
Code:
removeTableModelListener()
.
Bisher dachte ich mir, dass ich dazu die bereits bestehende Klasse EventListenerList benutze, um die hinzugefügten Listener zu hinterlegen. Allerdings bin ich nun schon an einigen Stellen über die Reihenfolge der Listener gestolpert und habe es daher über eine ArrayList gemacht.

Nun stellt sich mir allgemein die Frage, welchen Sinn es macht, die EventListenerList zu benutzen, so wie sie allgemein in Swing benutzt wird.
Hier mal eine Gegenüberstellung:
Java:
protected EventListenerList eventListeners;

public void addBlaListener(BlaListener listener)
{
    eventListeners.add(BlaListener.class, listener);
}

// Variante 1: So machte ich es bisher, führte aber teilweise zu 
// unerwünschtem Verhalten, weil ich die Liste von vorn nach hinten durchging,
// Swing macht es idR andersherum.
public void fireBlaEvent()
{
    BlaListener[] listener = eventListeners.getListeners(BlaListener.class);
    for (BlaListener l : listener)
        l.blaHappend(new BlaEvent(this));
}

// Variante 2: So ist es quasi überall in Swing implementiert, aber es scheint
// mir umständlich und ich finde es nicht sonderlich leserlich
public void fireBlaEvent()
{
    Object[] listener = eventListeners.getListenerList();
    for (int i = listener.length-2; i >= 0; i -= 2)
    {
        if (listener[i] == BlaListener.class)
        {
            ((BlaListener)listener[i+1]).blaHappend(new BlaEvent(this));
        }
    } //for
}

Ich bin nun teilweise dazu übergegangen eine ArrayList zu verwenden. In den Meisten Implementierungen hatte ich es bisher nur mit einer Art Listener zutun (Bsp. TableModel):
Java:
protected ArrayList<BlaListener> eventListener;

// addBlaListener düfte klar sein...

public void fireBlaEvent()
{
    for (BlaListener listener : eventListener)
    {
        listener.blaHappend(new BlaEvent(this));
    }
}

Nun sind meine Fragen:
Spricht etwas gegen ArrayList und für EventListenerList?
Sollte ich die Reihenfolge der Listener irgendwie anders beachten?

Meine Beobachtung ist eher gewesen, dass meine Variante 1 zu teilsweise seltsamen Verhalten führte, z.B. dass Zellen in JTables nicht direkt selektiert wurden, oder erst der CellEditor ansprang, dann wurde die Zelle aber selektiert und der Editor gleich wieder verworfen.
Also ich wäre um ein paar Erfahrungswerte dankbar. Derzeit tendiere ich mehr zu den ArrayLists, da ich diese Variante lesbarer finde.
 
S

SlaterB

Gast
viel macht die Klasse nicht, hat auch nur 200 Zeilen Code, getListeners(BlaListener.class) ist interessant,
und dann ist da noch Code zur Serialisierung, wahrscheinlich nicht so wichtig

* The main benefits that this class provides are that it is relatively
* cheap in the case of no listeners, and it provides serialization for
* event-listener lists in a single place, as well as a degree of MT safety
* (when used correctly).
API
 

Marco13

Top Contributor
Die EventListenerList kann afaik Listener beliebigen Typs speichern - sie enthält abwechselnd die Klasse (also das Class-Objekt) für den Typ, und danach das Objekt selbst.
Wie sich das "unerwünschte Verhalten" geäußert hat, hast du nicht gesagt.


Deine Letzte Lösung ist an sich OK, aber nicht Threadsafe, und kann zu einem Problem führen - wenn die (absurde???) Situation eintritt, dass einer der Listener einen neuen Listener zu der Liste hinzufügt (dann haut's ihn beim Iterieren über die Liste mit einer ConcurrentModificationException raus). Verhindern könnte man das in diesem Fall mit einer CopyOnWriteArrayList.
 

KrokoDiehl

Top Contributor
Ok, das mit der Threadsicherheit habe ich bisher noch nicht bedacht. Aber da sonst offenbar wenig gegen eine "eigene EventListenerList" spricht, spreche ich das mit den Kollegen ab, was wir konsequenterweise benutzen sollten.
Also danke euch.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Rückiteration bei der EventListenerList AWT, Swing, JavaFX & SWT 2
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
B ArrayList, Strings anzeigen AWT, Swing, JavaFX & SWT 1
S JavaFx - ausgewählte Rows in Arraylist (Tableview) AWT, Swing, JavaFX & SWT 4
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
K Swing JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 4
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
B Klasse mit ArrayList AWT, Swing, JavaFX & SWT 1
I JTable dynamisch aus ArrayList befüllen AWT, Swing, JavaFX & SWT 3
ZoXlike Wie kann man ArrayList in JTabel einlesen? [WindowBuilder] AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
E Eigenes TableModel für ArrayList<String[]> AWT, Swing, JavaFX & SWT 5
S ArrayList Problem AWT, Swing, JavaFX & SWT 3
T JTable dynamisch mit ArrayList AWT, Swing, JavaFX & SWT 2
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
T Swing Ausgabe aus ArrayList in Klasse1 in jTextArea in Klasse2 AWT, Swing, JavaFX & SWT 2
E Problem mit ArrayList AWT, Swing, JavaFX & SWT 7
P Auf gefüllte ArrayList zugreifen AWT, Swing, JavaFX & SWT 12
P ArrayList Rectangles2D AWT, Swing, JavaFX & SWT 29
O JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Z Swing JButton,JFrame, ArrayList & so weiter... AWT, Swing, JavaFX & SWT 20
C Swing NullPointerException beim Hinzufügen von Checkboxes in eine ArrayList AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
S JTable - 2D ArrayList & Falsche Werte. AWT, Swing, JavaFX & SWT 3
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
M Swing JTable soll auf ArrayList zugreifen AWT, Swing, JavaFX & SWT 8
B Swing JButtons in eine Arraylist<JButton> einfügen AWT, Swing, JavaFX & SWT 2
J Daten aus einer Textdatei in ArrayList holen AWT, Swing, JavaFX & SWT 9
J ArrayList Inhalt zählen AWT, Swing, JavaFX & SWT 53
J ArrayList Datensätze komplett löschen AWT, Swing, JavaFX & SWT 8
J ArrayList Datensätze auswerten AWT, Swing, JavaFX & SWT 10
Y Swing Aktualisieren eines JPanel mit ArrayList im TableLayout AWT, Swing, JavaFX & SWT 2
L ArrayList Wert löschen klappt nicht AWT, Swing, JavaFX & SWT 11
M ArrayList in 2D Array umfüllen AWT, Swing, JavaFX & SWT 9
C Swing ArrayList in JComboBox AWT, Swing, JavaFX & SWT 6
H ArrayList?! in Tabelle AWT, Swing, JavaFX & SWT 3
B ArrayList in JTable AWT, Swing, JavaFX & SWT 3
B ArrayList im JTextArea anzeigen lassen AWT, Swing, JavaFX & SWT 30
Ollek JTable - Tabelle füllen mit einer ArrayList AWT, Swing, JavaFX & SWT 22
T ArrayList aus KlasseA in KlasseB in JTextArea ausgeben AWT, Swing, JavaFX & SWT 12
I Swing JTree aus ArrayList<File> erzeugen AWT, Swing, JavaFX & SWT 15
C Swing ArrayList in jList AWT, Swing, JavaFX & SWT 3
Spot84 jtable mit checkboxnode dynamisch per arraylist füllen AWT, Swing, JavaFX & SWT 8
G Wie lasse ich einen Graphen zeichnen(mit einer ArrayList)? AWT, Swing, JavaFX & SWT 5
S Tree - ArrayList Zuordnung! AWT, Swing, JavaFX & SWT 13
nadal15 JTable und ArrayList - selected rows löschen AWT, Swing, JavaFX & SWT 6
G JTable - TableModel aus ArrayList AWT, Swing, JavaFX & SWT 8
QDog JComboBox updaten, ArrayList AWT, Swing, JavaFX & SWT 7
D JLabel's in einer ArrayList speichern? AWT, Swing, JavaFX & SWT 4
G jList mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
G datensätze aus der db in einer arraylist speicher und in gui AWT, Swing, JavaFX & SWT 4
G Aus Arraylist bestimmte Objekte wiedergegeben bekommen? AWT, Swing, JavaFX & SWT 7
L JTable und Daten aus einer ArrayList AWT, Swing, JavaFX & SWT 6
A Components in einer ArrayList aus anderer Klasse speichern AWT, Swing, JavaFX & SWT 8
S Anzahl ActionEvents (Strings in eine ArrayList einfügen) AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben