JDK-4178589 : ToolkitEventMulticaster must override AWTEventMulticaster.remove(EventListener)
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 1.1.7,1.2.0
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: generic,solaris_2.6,windows_nt
  • CPU: generic,x86,sparc
  • Submitted: 1998-10-03
  • Updated: 1999-01-15
  • Resolved: 1999-01-15
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
1.2.0 1.2fcsFixed
Related Reports
Duplicate :  
Duplicate :  
Duplicate :  
Relates :  
Relates :  
Relates :  
Description
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).

Comments
CONVERTED DATA BugTraq+ Release Management Values COMMIT TO FIX: generic FIXED IN: 1.2fcs INTEGRATED IN: 1.2fcs
14-06-2004

PUBLIC COMMENTS .
10-06-2004

EVALUATION I implemented ToolkitEventMulticaster.remove(EventListener), and that seems to have done the trick. fred.ecks@Eng 1998-10-07
07-10-1998