Other |
---|
1.2.0 1.2fcsFixed |
Duplicate :
|
|
Duplicate :
|
|
Duplicate :
|
|
Relates :
|
|
Relates :
|
|
Relates :
|
Because ToolkitEventMulticaster does not override remove(EventListener), the multicaster chain can be corrupted by inadvertant adds of AWTEventMulticaster instances, instead of ToolkitEventMulticaster instances. ToolkitEventMulticaster.remove(AWTEventListener, AWTEventListener) | |--> AWTEventMulticaster.removeInternal(EventListener, EventListener) | |--> AWTEventMulticaster.remove(EventListener) | |--> AWTEventMulticaster.addInternal(EventListener, | EventListener) | |--> creates instance of AWTEventMulticaster and adds it to multicaster chain. Then, a subsequent call to TookitEventMulticaster.remove(AWTEventListener, AWTEventListener) can fail with a ClassCastException. This happens when we try to cast one of the AWTEventMulticaster instances into an AWTEventListener. The stack dump looks something like this (the linenumbers aren't quite right because they're from my internal build): Exception occurred during event dispatching: java.lang.ClassCastException: java.awt.AWTEventMulticaster at java.awt.Toolkit$ToolkitEventMulticaster.remove(Toolkit.java:1571) at java.awt.Toolkit.removeAWTEventListener(Toolkit.java:1534) at java.awt.LightweightDispatcher$2.run(Container.java:1847) at java.security.AccessController.doPrivileged(Native Method) at java.awt.LightweightDispatcher.stopListeningForOtherDrags(Container.j ava:1844) at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:179 8) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:1705) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:1645) at java.awt.Container.dispatchEventImpl(Container.java:1019) at java.awt.Window.dispatchEventImpl(Window.java:678) at java.awt.Component.dispatchEvent(Component.java:2286) at java.awt.EventQueue.dispatchEvent(EventQueue.java:258) at java.awt.EventDispatchThread.run(EventDispatchThread.java:68) The bug seems to happen when dragging in a dialog which is being disposed. See dpm for a reproducible test case. Since AWTEventMulticaster.addInternal(EventListener, EventListener) is static, we can't override it in ToolkitEventMulticaster. Instead, we will need to override remove(EventListener).
|