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
- und
.
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:
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):
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.
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
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.