7145980: Dispose method of window.java takes long
Reviewed-by: anthony
This commit is contained in:
parent
bf8b18f80e
commit
d76f84108f
@ -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 {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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}.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user