我正在使用Swing实现GUI,我有一个JPanel,其中注册了一些Listerners:
JPanel graph=new JPanel();
graph.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseDragged(java.awt.event.MouseEvent evt) {
graphMouseDragged(evt);
}
});
graph.addMouseWheelListener(new java.awt.event.MouseWheelListener() {
public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
graphMouseWheelMoved(evt);
}
});
graph.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(java.awt.event.MouseEvent evt) {
graphMousePressed(evt);
}
});
这只是一个例子,Listerners的数量和类型可能会改变。
现在我想在阵列中获取所有注册的Listener,所以我尝试了:
java.util.EventListener listeners[] = graph.getListeners(java.util.EventListener.class);
根据我的理解,此方法应该返回在对象java.util.EventListener
上注册的graph
类型的所有侦听器。这个接口不应该是任何监听器的超接口?
所以我期望获得任何类型的所有侦听器,但实际上我得到一个空数组。
我是以正确的方式前进还是我错过了什么?我哪里错了?
答案 0 :(得分:2)
很抱歉,它不会那样工作(虽然我明白为什么你会这么做)。
T[] Component.getListeners(Class<T> listenerType)
方法仅返回使用相应的addXxxListener(...)
方法添加的侦听器。我相信这种方法是以这种方式实现的,以方便API设计人员/实施者,而不是API用户。我建议使用getXxxListeners()
而不是getListeners(XxxListener.class)
。
无论如何,这是一个例子:
JComponent comp = new JPanel();
MouseListener ml = new MouseAdapter() { /* Custom impl */ }
comp.addMouseListener(ml);
// ml is returned
MouseListener[] mls = comp.getListeners(MouseListener.class);
// Nothing is returned, as there's no support for adding listeners
// for generic EventListeners to a component
EventListener[] els = comp.getListeners(EventListener.class);
PS;如果你很好奇,如果你看一下源代码,可能更容易理解它是如何工作的。重要的课程是javax.swing.event.EventListenerList
。 : - )
答案 1 :(得分:0)
我很久以前就用过它了,这就是我记得做的事情。
protected void eventChange(Change change) {
for (ChangeListener listener:
listenerList.getListeners(ChangeListener.class)) {
listener.stateChanged(new ChangeEvent(this));
}
}
如果你想维护自己的监听器集合,CopyOnWriteArrayList。