提交 f9fd40e0 编写于 作者: B bagiras

7145980: Dispose method of window.java takes long

Reviewed-by: anthony
上级 07b734a2
...@@ -10070,11 +10070,12 @@ public abstract class Component implements ImageObserver, MenuContainer, ...@@ -10070,11 +10070,12 @@ public abstract class Component implements ImageObserver, MenuContainer,
} }
Window window = getContainingWindow(); Window window = getContainingWindow();
if (window != null) { if (window != null) {
if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants()) { if (!window.hasHeavyweightDescendants() || !window.hasLightweightDescendants() || window.isDisposing()) {
if (mixingLog.isLoggable(PlatformLogger.FINE)) { if (mixingLog.isLoggable(PlatformLogger.FINE)) {
mixingLog.fine("containing window = " + window + mixingLog.fine("containing window = " + window +
"; has h/w descendants = " + window.hasHeavyweightDescendants() + "; has h/w descendants = " + window.hasHeavyweightDescendants() +
"; has l/w descendants = " + window.hasLightweightDescendants()); "; has l/w descendants = " + window.hasLightweightDescendants() +
"; disposing = " + window.isDisposing());
} }
return false; return false;
} }
......
...@@ -226,6 +226,7 @@ public class Window extends Container implements Accessible { ...@@ -226,6 +226,7 @@ public class Window extends Container implements Accessible {
static boolean systemSyncLWRequests = false; static boolean systemSyncLWRequests = false;
boolean syncLWRequests = false; boolean syncLWRequests = false;
transient boolean beforeFirstShow = true; transient boolean beforeFirstShow = true;
private transient boolean disposing = false;
static final int OPENED = 0x01; static final int OPENED = 0x01;
...@@ -1162,36 +1163,41 @@ public class Window extends Container implements Accessible { ...@@ -1162,36 +1163,41 @@ public class Window extends Container implements Accessible {
void doDispose() { void doDispose() {
class DisposeAction implements Runnable { class DisposeAction implements Runnable {
public void run() { public void run() {
// Check if this window is the fullscreen window for the disposing = true;
// device. Exit the fullscreen mode prior to disposing try {
// of the window if that's the case. // Check if this window is the fullscreen window for the
GraphicsDevice gd = getGraphicsConfiguration().getDevice(); // device. Exit the fullscreen mode prior to disposing
if (gd.getFullScreenWindow() == Window.this) { // of the window if that's the case.
gd.setFullScreenWindow(null); GraphicsDevice gd = getGraphicsConfiguration().getDevice();
} if (gd.getFullScreenWindow() == Window.this) {
gd.setFullScreenWindow(null);
}
Object[] ownedWindowArray; Object[] ownedWindowArray;
synchronized(ownedWindowList) { synchronized(ownedWindowList) {
ownedWindowArray = new Object[ownedWindowList.size()]; ownedWindowArray = new Object[ownedWindowList.size()];
ownedWindowList.copyInto(ownedWindowArray); ownedWindowList.copyInto(ownedWindowArray);
}
for (int i = 0; i < ownedWindowArray.length; i++) {
Window child = (Window) (((WeakReference)
(ownedWindowArray[i])).get());
if (child != null) {
child.disposeImpl();
} }
} for (int i = 0; i < ownedWindowArray.length; i++) {
hide(); Window child = (Window) (((WeakReference)
beforeFirstShow = true; (ownedWindowArray[i])).get());
removeNotify(); if (child != null) {
synchronized (inputContextLock) { child.disposeImpl();
if (inputContext != null) { }
inputContext.dispose(); }
inputContext = null; hide();
beforeFirstShow = true;
removeNotify();
synchronized (inputContextLock) {
if (inputContext != null) {
inputContext.dispose();
inputContext = null;
}
} }
clearCurrentFocusCycleRootOnHide();
} finally {
disposing = false;
} }
clearCurrentFocusCycleRootOnHide();
} }
} }
DisposeAction action = new DisposeAction(); DisposeAction action = new DisposeAction();
...@@ -2734,6 +2740,10 @@ public class Window extends Container implements Accessible { ...@@ -2734,6 +2740,10 @@ public class Window extends Container implements Accessible {
return visible; return visible;
} }
boolean isDisposing() {
return disposing;
}
/** /**
* @deprecated As of J2SE 1.4, replaced by * @deprecated As of J2SE 1.4, replaced by
* {@link Component#applyComponentOrientation Component.applyComponentOrientation}. * {@link Component#applyComponentOrientation Component.applyComponentOrientation}.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册