--- a/jdk/src/share/classes/java/awt/Component.java Wed Feb 22 22:09:53 2012 -0800
+++ b/jdk/src/share/classes/java/awt/Component.java Fri Feb 24 13:50:37 2012 +0400
@@ -10070,11 +10070,12 @@
}
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;
}
--- a/jdk/src/share/classes/java/awt/Window.java Wed Feb 22 22:09:53 2012 -0800
+++ b/jdk/src/share/classes/java/awt/Window.java Fri Feb 24 13:50:37 2012 +0400
@@ -226,6 +226,7 @@
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 @@
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);
- }
-
- Object[] ownedWindowArray;
- synchronized(ownedWindowList) {
- ownedWindowArray = new Object[ownedWindowList.size()];
- ownedWindowList.copyInto(ownedWindowArray);
+ 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();
+ }
+ }
+ hide();
+ beforeFirstShow = true;
+ removeNotify();
+ synchronized (inputContextLock) {
+ if (inputContext != null) {
+ inputContext.dispose();
+ inputContext = null;
+ }
+ }
+ clearCurrentFocusCycleRootOnHide();
+ } finally {
+ disposing = false;
}
- 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();
}
}
DisposeAction action = new DisposeAction();
@@ -2734,6 +2740,10 @@
return visible;
}
+ boolean isDisposing() {
+ return disposing;
+ }
+
/**
* @deprecated As of J2SE 1.4, replaced by
* {@link Component#applyComponentOrientation Component.applyComponentOrientation}.