Dav*_*lle 13 java events swing
当我学习如何在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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我正在查看只是将侦听器放入HashMap(可能是任何集合)的代码,侦听器接口不会扩展EventListener,而fire方法如下所示:
protected void fireChangeOccurred(Change change) {
for (ChangeListener listener : listeners) {
listener.changeOccurred(change);
}
}
Run Code Online (Sandbox Code Playgroud)
使用EventListenerList而不仅仅是维护我自己的侦听器列表有什么好处?只有侦听器在Swing组件中才真正重要 - 对于事件调度线程是否重要?
EventListenerList
有一个方法,getListeners(Class<T> t)
特别是对你只对一种事件类型感兴趣的情况.
以下是如何使用它的示例:
protected void fireChangeOccurred(Change change) {
for (ChangeListener listener:
listenerList.getListeners(ChangeListener.class)) {
listener.stateChanged(new ChangeEvent(this));
}
}
Run Code Online (Sandbox Code Playgroud)
如果您选择维护自己的听众集合,我建议您使用CopyOnWriteArrayList
.
对我来说,主要优点EventListenerList
是如果包含类具有(或可能具有)多种类型的侦听器.许多Swing组件都可以; 你正在审查的那个可能没有.第二个例子较短,但它具有隐含的设计限制.