Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java swing:事件侦听器支持类_Java_Swing_Listener - Fatal编程技术网

Java swing:事件侦听器支持类

Java swing:事件侦听器支持类,java,swing,listener,Java,Swing,Listener,是否有任何预先存在的类可以帮助支持添加/删除EventListener操作?(有点像PropertyChangeSupport) 我试图用Java将代码划分为模型和视图。我有一些数据不稳定地到达,希望模型支持某种类型的EventListener,以便视图可以订阅模型中的更改。数据非常复杂,我不想做整个细粒度Javabeans属性更改支持;相反,我只想允许以粗略的方式通知模型已更改 如何才能最好地做到这一点?我不确定这是否回答了您的问题,但您可以使用javax.swing.event.EventL

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

我试图用Java将代码划分为模型和视图。我有一些数据不稳定地到达,希望模型支持某种类型的EventListener,以便视图可以订阅模型中的更改。数据非常复杂,我不想做整个细粒度Javabeans属性更改支持;相反,我只想允许以粗略的方式通知模型已更改


如何才能最好地做到这一点?

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

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

我会小心处理的。这只是某种变化的迹象

至于实现添加/删除/激发功能。没有类似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对象供子类使用。

为此,您可以使用Apache Commons Lang库提供的类。它是成熟的、经过战斗测试的代码。

是的,
changevent
是一个真正的状态更改事件
PropertyChangeEvent
是错误的,在整个Swing过程中IIRC的实现是错误的。移动到没有无意义事件对象的事件模型可能太多了(哦,还有@Devon,奇怪的
决赛
不会错过的。)