我扩展了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);
答案 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.
}
}