Search code examples
javaawttoolkit

Why would an AWTEventListener not be added?


I extended AWTEventListener, and then added it to the toolkit. However, when I try to assert that my listener is in the AWTListeners, my assertion fails. I call this from within the listener (although I don't know why that would cause a problem).

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);

Solution

  • The AWTEventListeners within the default toolkit are maintained as proxies (java.awt.event.AWTEventListenerProxy), which wrap the listeners that were added.

    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.
        }
    }