2010-04-28 22 views
6

Esiste una classe preesistente che aiuti a supportare/rimuovere le operazioni di EventListener? (un po 'come PropertyChangeSupport)swing: classe di supporto listener di eventi

Sto provando a partizionare il mio codice in un modello e visualizzare in Java. Ho alcuni dati che arrivano in modo irregolare e vorrei che il modello supporti qualche tipo di EventListener in modo che una vista possa iscriversi alle modifiche nel modello. I dati sono numerosi + abbastanza complicati da non voler fare l'intero supporto per la modifica delle proprietà dei Javabeans a grana fine; piuttosto vorrei solo consentire la notifica che il modello è cambiato in modo grossolano.

come posso fare meglio?

risposta

9

avrei gestire che con un ChangeEvent. È solo un'indicazione che lo qualcosa è cambiato.

Come per l'implementazione della funzionalità add/remove/fire. Non esiste un meccanismo come PropertyChangeSupport, ma il codice è abbastanza semplice da non averne realmente bisogno.

private final EventListenerList listenerList = new EventListenerList(); 
private final ChangeEvent stateChangeEvent = new ChangeEvent(this); 

public void addChangeListener(ChangeListener l) { 
    listenerList.add(ChangeListener.class, l); 
} 
public void removeChangeListener(ChangeListener l) { 
    listenerList.remove(ChangeListener.class, l); 
} 
protected void fireChange() { 
    for (ChangeListener l: listenerList.getListeners(ChangeListener.class)) { 
     l.stateChanged(stateChangeEvent); 
    } 
} 

Nota: JComponent fornisce un listenerList oggetto protetto per l'uso da sottoclassi.

+0

fantastico, grazie !. –

+0

Sì, 'ChangeEvent' è l'unico vero evento di modifica dello stato. 'PropertyChangeEvent' è semplicemente sbagliato e IIRC è stato implementato in modo scorretto su Swing. Probabilmente è troppo per passare a un modello di eventi che non ha quell'oggetto evento privo di scopo. :((Oh, e @Devon, lo strano 'finale' non andrebbe a mancare lì.) –

+0

@ Tom ringrazia per la cattura. –

1

Non sono sicuro che questo risponda alla tua domanda, ma potresti usare uno javax.swing.event.EventListenerList, supporta le operazioni add() e remove() per gli ascoltatori. Poi si può iterare su una particolare sottoclasse ascoltatore per generare gli eventi:

for (MyListener listener : listenerList.getListeners(MyListener.class) { 
    listener.fireEvent(...); 
}