获取在组件上注册的所有监听器

时间:2014-05-21 11:21:44

标签: java swing events awt listener

我正在使用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类型的所有侦听器。这个接口不应该是任何监听器的超接口?

所以我期望获得任何类型的所有侦听器,但实际上我得到一个空数组。

我是以正确的方式前进还是我错过了什么?我哪里错了?

2 个答案:

答案 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。

相关问题