2010-04-28 12 views
6

¿Existe alguna clase preexistente que ayude a agregar/eliminar operaciones de EventListener? (tipo de como PropertyChangeSupport)swing: clase de soporte de escucha de eventos

Estoy tratando de dividir mi código en un modelo y ver en Java. Tengo algunos datos que llegan erráticamente y me gustaría que el modelo sea compatible con algún tipo de EventListener para que una vista pueda suscribirse a los cambios en el modelo. Los datos son numerosos y lo suficientemente complicados como para no tener que hacer todo el soporte de cambio de propiedad de Javabeans; más bien, me gustaría permitir la notificación de que el modelo ha cambiado de manera aproximada.

¿cómo puedo hacer esto mejor?

Respuesta

9

Me gustaría manejar eso con un ChangeEvent. Es solo una indicación de que algo ha cambiado.

En cuanto a la implementación de la funcionalidad agregar/eliminar/disparar. No hay ningún mecanismo como PropertyChangeSupport, pero el código es bastante simple y no es realmente necesario.

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 proporciona un listenerList objeto protegido para el uso de sub-clases.

+0

genial, ¡gracias !. –

+0

Sí, 'ChangeEvent' es el único evento de cambio de estado verdadero. 'PropertyChangeEvent' es simplemente incorrecto, y IIRC incorrectamente implementado a lo largo de Swing. Probablemente sea demasiado pasar a un modelo de evento que no tenga ese objeto de evento sin sentido. :((Ah, y @Devon, el 'final' extraño no sería una falla allí.) –

+0

@Tom gracias por la captura. –

1

No estoy seguro de si eso responde su pregunta, pero podría usar un javax.swing.event.EventListenerList, admite las operaciones de agregar() y eliminar() para sus oyentes. A continuación, puede repetir un oyente subclase particular, para desencadenar eventos:

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