tM --
tM --

Reputation: 207

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

Upvotes: 0

Views: 323

Answers (2)

Peter Walser
Peter Walser

Reputation: 15706

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

Upvotes: 2

Braj
Braj

Reputation: 46871

As per source code of Toolkit it internally uses proxy as shown below that's assert is failed.

To prove this simply print the hash code of of the listener object that you passed and that is returned from getAWTEventListeners().

Alternatively you can check on Listener class name.

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

Upvotes: 2

Related Questions