src/share/classes/java/awt/Container.java
Print this page
@@ -3304,10 +3304,20 @@
if (cont == this || isParentOf(cont)) {
kfm.setGlobalCurrentFocusCycleRootPriv(null);
}
}
+ @Override
+ void clearLightweightDispatcherOnRemove(Component removedComponent) {
+ if (dispatcher != null) {
+ dispatcher.removeReferences(removedComponent);
+ } else {
+ //It is a Lightweight Container, should clear parent`s Dispatcher
+ super.clearLightweightDispatcherOnRemove(removedComponent);
+ }
+ }
+
final Container getTraversalRoot() {
if (isFocusCycleRoot()) {
return findTraversalRoot();
}
@@ -4409,10 +4419,11 @@
*/
void dispose() {
//System.out.println("Disposing lw dispatcher");
stopListeningForOtherDrags();
mouseEventTarget = null;
+ targetLastEntered = null;
}
/**
* Enables events to subcomponents.
*/
@@ -4500,10 +4511,11 @@
// 4508327 : MOUSE_CLICKED should only go to the recipient of
// the accompanying MOUSE_PRESSED, so don't reset mouseEventTarget on a
// MOUSE_CLICKED.
if (!isMouseGrab(e) && id != MouseEvent.MOUSE_CLICKED) {
mouseEventTarget = (mouseOver != nativeContainer) ? mouseOver: null;
+ isCleaned = false;
}
if (mouseEventTarget != null) {
switch (id) {
case MouseEvent.MOUSE_ENTERED:
@@ -4547,10 +4559,14 @@
}
//Consuming of wheel events is implemented in "retargetMouseEvent".
if (id != MouseEvent.MOUSE_WHEEL) {
e.consume();
}
+ } else if (isCleaned && id != MouseEvent.MOUSE_WHEEL) {
+ //After mouseEventTarget was removed and cleaned should consume all events
+ //until new mouseEventTarget is found
+ e.consume();
}
return e.isConsumed();
}
private boolean processDropTargetEvent(SunDropTargetEvent e) {
@@ -4890,10 +4906,15 @@
* The last component entered
*/
private transient Component targetLastEntered;
/**
+ * Indicates whether {@code mouseEventTarget} was removed and nulled
+ */
+ private transient boolean isCleaned;
+
+ /**
* Is the mouse over the native container
*/
private transient boolean isMouseInNativeContainer = false;
/**
@@ -4923,6 +4944,16 @@
private static final long MOUSE_MASK =
AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK |
AWTEvent.MOUSE_WHEEL_EVENT_MASK;
+
+ void removeReferences(Component removedComponent) {
+ if (mouseEventTarget == removedComponent) {
+ isCleaned = true;
+ mouseEventTarget = null;
+ }
+ if (targetLastEntered == removedComponent) {
+ targetLastEntered = null;
+ }
+ }
}