diff --git a/jdk/src/share/classes/java/awt/Component.java b/jdk/src/share/classes/java/awt/Component.java index 22c380137c0..63fe2a80be9 100644 --- a/jdk/src/share/classes/java/awt/Component.java +++ b/jdk/src/share/classes/java/awt/Component.java @@ -10070,11 +10070,12 @@ public abstract class Component implements ImageObserver, MenuContainer, } Window window = getContainingWindow(); if (window != null) { - if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants()) { + if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants() || window.isDisposing()) { if (mixingLog.isLoggable(PlatformLogger.FINE)) { mixingLog.fine("containing window = " + window + "; has h/w descendants = " + window.hasHeavyweightDescendants() + - "; has l/w descendants = " + window.hasLightweightDescendants()); + "; has l/w descendants = " + window.hasLightweightDescendants() + + "; disposing = " + window.isDisposing()); } return false; } diff --git a/jdk/src/share/classes/java/awt/Window.java b/jdk/src/share/classes/java/awt/Window.java index 646d9ded822..1e2ee59a09a 100644 --- a/jdk/src/share/classes/java/awt/Window.java +++ b/jdk/src/share/classes/java/awt/Window.java @@ -226,6 +226,7 @@ public class Window extends Container implements Accessible { static boolean systemSyncLWRequests = false; boolean syncLWRequests = false; transient boolean beforeFirstShow = true; + private transient boolean disposing = false; static final int OPENED = 0x01; @@ -1162,36 +1163,41 @@ public class Window extends Container implements Accessible { void doDispose() { class DisposeAction implements Runnable { public void run() { - // Check if this window is the fullscreen window for the - // device. Exit the fullscreen mode prior to disposing - // of the window if that's the case. - GraphicsDevice gd = getGraphicsConfiguration().getDevice(); - if (gd.getFullScreenWindow() == Window.this) { - gd.setFullScreenWindow(null); - } + disposing = true; + try { + // Check if this window is the fullscreen window for the + // device. Exit the fullscreen mode prior to disposing + // of the window if that's the case. + GraphicsDevice gd = getGraphicsConfiguration().getDevice(); + if (gd.getFullScreenWindow() == Window.this) { + gd.setFullScreenWindow(null); + } - Object[] ownedWindowArray; - synchronized(ownedWindowList) { - ownedWindowArray = new Object[ownedWindowList.size()]; - ownedWindowList.copyInto(ownedWindowArray); - } - for (int i = 0; i < ownedWindowArray.length; i++) { - Window child = (Window) (((WeakReference) - (ownedWindowArray[i])).get()); - if (child != null) { - child.disposeImpl(); + Object[] ownedWindowArray; + synchronized(ownedWindowList) { + ownedWindowArray = new Object[ownedWindowList.size()]; + ownedWindowList.copyInto(ownedWindowArray); } - } - hide(); - beforeFirstShow = true; - removeNotify(); - synchronized (inputContextLock) { - if (inputContext != null) { - inputContext.dispose(); - inputContext = null; + for (int i = 0; i < ownedWindowArray.length; i++) { + Window child = (Window) (((WeakReference) + (ownedWindowArray[i])).get()); + if (child != null) { + child.disposeImpl(); + } } + hide(); + beforeFirstShow = true; + removeNotify(); + synchronized (inputContextLock) { + if (inputContext != null) { + inputContext.dispose(); + inputContext = null; + } + } + clearCurrentFocusCycleRootOnHide(); + } finally { + disposing = false; } - clearCurrentFocusCycleRootOnHide(); } } DisposeAction action = new DisposeAction(); @@ -2734,6 +2740,10 @@ public class Window extends Container implements Accessible { return visible; } + boolean isDisposing() { + return disposing; + } + /** * @deprecated As of J2SE 1.4, replaced by * {@link Component#applyComponentOrientation Component.applyComponentOrientation}.