是否有任何预先存在的类可以帮助支持添加/删除EventListener操作? (有点像PropertyChangeSupport)swing:事件侦听器支持类
我想将我的代码分区到一个模型和Java中的视图。我有一些数据到达不规律,并希望模型支持某种EventListener,以便视图可以订阅模型中的更改。这些数据非常复杂,我不希望必须执行整个细粒度的Javabeans属性更改支持;相反,我只是想通知模型已经以粗略的方式发生了变化。
我该如何做到最好?
是否有任何预先存在的类可以帮助支持添加/删除EventListener操作? (有点像PropertyChangeSupport)swing:事件侦听器支持类
我想将我的代码分区到一个模型和Java中的视图。我有一些数据到达不规律,并希望模型支持某种EventListener,以便视图可以订阅模型中的更改。这些数据非常复杂,我不希望必须执行整个细粒度的Javabeans属性更改支持;相反,我只是想通知模型已经以粗略的方式发生了变化。
我该如何做到最好?
我会处理与一个ChangeEvent。这只是一个迹象,东西已经改变。
至于实施添加/删除/火灾功能。没有像PropertyChangeSupport这样的机制,但代码非常简单,并不需要它。
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);
}
}
注:JComponent提供受保护的listenerList
对象供子类使用。
我不确定这是否回答您的问题,但您可以使用javax.swing.event.EventListenerList
,它支持您的侦听器的add()和remove()操作。然后你可以遍历特定监听器子类来触发事件:
for (MyListener listener : listenerList.getListeners(MyListener.class) {
listener.fireEvent(...);
}
太好了,谢谢! – 2010-04-28 19:06:46
是的,'ChangeEvent'是一个真实的状态改变事件。 'PropertyChangeEvent'是错误的,并且IIRC在Swing中不正确地实现。移动到没有那个毫无意义的事件对象的事件模型可能太多了。 :(:(哦,和@Devon,奇怪的'最后'不会在那里错过。) – 2010-04-28 19:26:37
@Tom感谢您的收获。 – 2010-04-28 20:16:26