java - 何时使用 EventListenerList 而不是一般的监听器集合

标签 java swing events

当我学习如何在 Java 中触发事件时,我熟悉了 EventListenerList。当我创建自己的监听器时,我编写监听器以扩展 EventListener,我将它们存储在 EventListenerList 中,我的 fire 方法将像这样遍历事件监听器:

protected void fireChangeOccurred(Change change) {
    Object[] listeners = listenerList.getListenerList();
    for (int i = listeners.length-2; i>=0; i-=2) {
        if (listeners[i]==ChangeListener.class) {
            ((ChangeListener)listeners[i+1]).changeOccurred(change);
        }
    }
}

现在我正在审查代码,它只是将监听器放入 HashMap(可以是任何集合),监听器接口(interface)不扩展 EventListener,fire 方法如下所示:

protected void fireChangeOccurred(Change change) {
    for (ChangeListener listener : listeners) {
        listener.changeOccurred(change);
    }
}

使用 EventListenerList 而不是仅仅维护我自己的监听器列表有什么优势?是否真的只在监听器位于 Swing 组件中时才重要 - 它对事件调度线程重要吗?

最佳答案

EventListenerList有一个method , getListeners(Class<T> t) ,特别适用于您只对一种事件类型感兴趣的情况。

这是一个如何使用它的例子:

protected void fireChangeOccurred(Change change) {
    for (ChangeListener listener:
         listenerList.getListeners(ChangeListener.class)) {
            listener.stateChanged(new ChangeEvent(this));
    }
}

如果您选择维护自己的听众集合,我推荐 CopyOnWriteArrayList .

关于java - 何时使用 EventListenerList 而不是一般的监听器集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240472/

相关文章:

java - Hadoop Mapreduce 自定义记录读取器

java - 如何在没有 Applets 的情况下在浏览器中显示 JFrame 应用程序

qt - 当项目完成重绘时,我会收到通知吗?

jquery - 在 jQuery 中多次声明相同的窗口事件可以吗?

java - 控制另一个类中的对象

java - 在这个 JMS 示例中,JNDI 查找是如何工作的?

java - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES) IN WAMPSERVER

java 。对象字段为空的含义

Java Swing : Graphic component only appears in top-left corner zone

events - 像素 : create custom event in sprite and listen in another sprite