为什么不添加AWTEventListener?

时间:2014-05-13 19:10:20

标签: java awt toolkit

我扩展了AWTEventListener,然后将其添加到工具包中。但是,当我试图断言我的监听器在AWTListeners时,我的断言失败了。我在听众中称呼这个(虽然我不知道为什么会导致问题)。

Toolkit.getDefaultToolkit().addAWTEventListener(this, AWTEvent.MOUSE_EVENT_MASK
                                              | AWTEvent.KEY_EVENT_MASK
                                              | AWTEvent.MOUSE_MOTION_EVENT_MASK
                                              | AWTEvent.MOUSE_WHEEL_EVENT_MASK);
assert ArrayUtils.contains
                      (Toolkit.getDefaultToolkit().getAWTEventListeners(), this);

2 个答案:

答案 0 :(得分:2)

根据Toolkit的源代码,它在内部使用代理,如下所示,断言失败。

为了证明这一点,只需打印您传递的侦听器对象的哈希码以及从getAWTEventListeners()返回的哈希码。

或者,您可以检查监听器类名称。

public void addAWTEventListener(AWTEventListener listener, long eventMask) {
    AWTEventListener localL = deProxyAWTEventListener(listener);

    if (localL == null) {
        return;
    }
    ...
}

static private AWTEventListener deProxyAWTEventListener(AWTEventListener l)
{
    AWTEventListener localL = l;

    if (localL == null) {
        return null;
    }
    // if user passed in a AWTEventListenerProxy object, extract
    // the listener
    if (l instanceof AWTEventListenerProxy) {
        localL = (AWTEventListener)((AWTEventListenerProxy)l).getListener();
    }
    return localL;
}

答案 1 :(得分:2)

默认工具包中的AWTEventListener被维护为代理(java.awt.event.AWTEventListenerProxy),它们包装了已添加的侦听器。

Toolkit.getDefaultToolkit().addAWTEventListener(this, ...);

for (AWTEventListener listener : Toolkit.getDefaultToolkit().getAWTEventListeners()) {

    java.awt.event.AWTEventListenerProxy proxy = (java.awt.event.AWTEventListenerProxy) listener;
    if (proxy.getListener().equals(this) {
        // there, we found it.
    }
}