-
Bug
-
Resolution: Unresolved
-
P4
-
None
-
1.4.0
-
sparc
-
solaris_8
We currently have a problem where the strategy to target mouse events to
specific components in internal frames seems to differ if the internal
frame is in-focus or out-of-focus.
The problem seems to occur as we rely on the fact that mouse events
are propagate upwards in the Component hierarchy when children components
are not interested in those events.
This behavior changes when inactive internal frames come into play:
A normaly active frame will behave properly and will propagte the events
upwards as it should when a child is set to ignore all mouse events.
On the flip side, when an internal frame goes inactive, the mouse events
are directly targeted to the child component even when that child
does not require them.
Please see the attached Main.java testcase. This example outlines a problem with Mouse Event propagation in Java with internal Frame.
Run this class and set the "Frame With ToolTip" active. Putting the Mouse Cursor anywhere in the frame will show the tooltip (especially over the label).
If you put the "Frame With ToolTip" inactive (by selecting the dummy frame) while keeping it still visible and then try to show the tooltip by moving the mouse cursor over the label, then no tooltip will comes up. Yet if you move the cursor over the panel, the tooltip will come up.
We trace the code to two different ways of targeting Components:
1) In normal behavior (the case where an inactive frame is active)
The targeting of the component is done by Container.java's
getMouseEventTarget : We can see ( build 1.3.1_01 and 1.4beta3) that the
algorithm has a provison to travers the hierarchy upwards when
a potential target (a child) will ignore the event.
2) The alternate behavior occurs when, in BasicInternalFrameUI,
the GlassPaneDispatcher's findComponentAt locates the component
(regardless of it's interest in the event) and then dispatches
the event.
It would be "better" if there was a clean way for the GlassPaneDispatcher
to figure out if the component is interested with the given event
before accepting it as the target of the event. Unfortunaly,
there is currently no way to access "eventEnabled" on Component as
it is package private.
specific components in internal frames seems to differ if the internal
frame is in-focus or out-of-focus.
The problem seems to occur as we rely on the fact that mouse events
are propagate upwards in the Component hierarchy when children components
are not interested in those events.
This behavior changes when inactive internal frames come into play:
A normaly active frame will behave properly and will propagte the events
upwards as it should when a child is set to ignore all mouse events.
On the flip side, when an internal frame goes inactive, the mouse events
are directly targeted to the child component even when that child
does not require them.
Please see the attached Main.java testcase. This example outlines a problem with Mouse Event propagation in Java with internal Frame.
Run this class and set the "Frame With ToolTip" active. Putting the Mouse Cursor anywhere in the frame will show the tooltip (especially over the label).
If you put the "Frame With ToolTip" inactive (by selecting the dummy frame) while keeping it still visible and then try to show the tooltip by moving the mouse cursor over the label, then no tooltip will comes up. Yet if you move the cursor over the panel, the tooltip will come up.
We trace the code to two different ways of targeting Components:
1) In normal behavior (the case where an inactive frame is active)
The targeting of the component is done by Container.java's
getMouseEventTarget : We can see ( build 1.3.1_01 and 1.4beta3) that the
algorithm has a provison to travers the hierarchy upwards when
a potential target (a child) will ignore the event.
2) The alternate behavior occurs when, in BasicInternalFrameUI,
the GlassPaneDispatcher's findComponentAt locates the component
(regardless of it's interest in the event) and then dispatches
the event.
It would be "better" if there was a clean way for the GlassPaneDispatcher
to figure out if the component is interested with the given event
before accepting it as the target of the event. Unfortunaly,
there is currently no way to access "eventEnabled" on Component as
it is package private.
- relates to
-
JDK-4506456 Mousedragged events are limited in the internal frame before it's been activated
- Closed