2010-04-28 89 views
6

是否有任何预先存在的类可以帮助支持添加/删除EventListener操作? (有点像PropertyChangeSupport)swing:事件侦听器支持类

我想将我的代码分区到一个模型和Java中的视图。我有一些数据到达不规律,并希望模型支持某种EventListener,以便视图可以订阅模型中的更改。这些数据非常复杂,我不希望必须执行整个细粒度的Javabeans属性更改支持;相反,我只是想通知模型已经以粗略的方式发生了变化。

我该如何做到最好?

回答

9

我会处理与一个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对象供子类使用。

+0

太好了,谢谢! – 2010-04-28 19:06:46

+0

是的,'ChangeEvent'是一个真实的状态改变事件。 'PropertyChangeEvent'是错误的,并且IIRC在Swing中不正确地实现。移动到没有那个毫无意义的事件对象的事件模型可能太多了。 :(:(哦,和@Devon,奇怪的'最后'不会在那里错过。) – 2010-04-28 19:26:37

+0

@Tom感谢您的收获。 – 2010-04-28 20:16:26

1

我不确定这是否回答您的问题,但您可以使用javax.swing.event.EventListenerList,它支持您的侦听器的add()和remove()操作。然后你可以遍历特定监听器子类来触发事件:

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