JDK-7132809 : [macosx] MAXIMIZED_BOTH set before setVisible(true) hides Frame
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 7
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: os_x
  • CPU: x86
  • Submitted: 2012-01-24
  • Updated: 2012-03-23
  • Resolved: 2012-02-16
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 7
7u4 b11Fixed
Related Reports
Relates :  
Description
Mac OS X 10.7.2 macmini4,1
Run a manual regression test java/awt/Frame/InitialMaximizedTest/InitialMaximizedTest : a Frame which should be displayed maximized is not visible at all. Comment out  setExtendedState(Frame.MAXIMIZED_BOTH) or move it after setVisible(True), and everything will work as expected.

Comments
EVALUATION 8-na: the fix is integrated as a part of 7113349.
23-03-2012

SUGGESTED FIX --- old/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-01-26 19:35:07.000000000 +0400 +++ new/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java 2012-01-26 19:35:07.000000000 +0400 @@ -473,29 +473,70 @@ @Override // PlatformWindow public void setVisible(boolean visible) { + final long nsWindowPtr = getNSWindowPtr(); + if (owner != null) { if (!visible) { - CWrapper.NSWindow.removeChildWindow(owner.getNSWindowPtr(), getNSWindowPtr()); + CWrapper.NSWindow.removeChildWindow(owner.getNSWindowPtr(), nsWindowPtr); } } updateIconImages(); updateFocusabilityForAutoRequestFocus(false); + if (!visible) { + // Cancel out the extended state + if (target instanceof Frame) { + switch (((Frame)target).getExtendedState()) { + case Frame.ICONIFIED: + CWrapper.NSWindow.deminiaturize(nsWindowPtr); + break; + case Frame.MAXIMIZED_BOTH: + CWrapper.NSWindow.zoom(nsWindowPtr); + break; + } + } + } + LWWindowPeer blocker = peer.getBlocker(); if (blocker == null || !visible) { // If it ain't blocked, or is being hidden, go regular way - setVisibleHelper(visible); + if (visible) { + CWrapper.NSWindow.makeFirstResponder(nsWindowPtr, contentView.getAWTView()); + boolean isKeyWindow = CWrapper.NSWindow.isKeyWindow(nsWindowPtr); + if (!isKeyWindow) { + CWrapper.NSWindow.makeKeyAndOrderFront(nsWindowPtr); + } else { + CWrapper.NSWindow.orderFront(nsWindowPtr); + } + } else { + CWrapper.NSWindow.orderOut(nsWindowPtr); + } } else { // otherwise, put it in a proper z-order - CWrapper.NSWindow.orderWindow(getNSWindowPtr(), CWrapper.NSWindow.NSWindowBelow, + CWrapper.NSWindow.orderWindow(nsWindowPtr, CWrapper.NSWindow.NSWindowBelow, ((CPlatformWindow)blocker.getPlatformWindow()).getNSWindowPtr()); } + + if (visible) { + // Re-apply the extended state + if (target instanceof Frame) { + switch (((Frame)target).getExtendedState()) { + case Frame.ICONIFIED: + CWrapper.NSWindow.miniaturize(nsWindowPtr); + break; + case Frame.MAXIMIZED_BOTH: + CWrapper.NSWindow.zoom(nsWindowPtr); + break; + } + } + } + updateFocusabilityForAutoRequestFocus(true); if (owner != null) { if (visible) { - CWrapper.NSWindow.addChildWindow(owner.getNSWindowPtr(), getNSWindowPtr(), CWrapper.NSWindow.NSWindowAbove); + CWrapper.NSWindow.addChildWindow(owner.getNSWindowPtr(), nsWindowPtr, CWrapper.NSWindow.NSWindowAbove); } } @@ -620,17 +661,17 @@ @Override public void setWindowState(int windowState) { + if (!peer.isVisible()) { + // setVisible() applies the state + return; + } + int prevWindowState = peer.getState(); if (prevWindowState == windowState) return; final long nsWindowPtr = getNSWindowPtr(); switch (windowState) { case Frame.ICONIFIED: - if (!peer.isVisible()) { - // later on the setVisible will minimize itself - // otherwise, orderFront will deminiaturize window - return; - } if (prevWindowState == Frame.MAXIMIZED_BOTH) { // let's return into the normal states first // the zoom call toggles between the normal and the max states @@ -665,33 +706,6 @@ // UTILITY METHODS // ---------------------------------------------------------------------- - private void setVisibleHelper(boolean visible) { - final long nsWindowPtr = getNSWindowPtr(); - if (visible) { - CWrapper.NSWindow.makeFirstResponder(nsWindowPtr, contentView.getAWTView()); - boolean isKeyWindow = CWrapper.NSWindow.isKeyWindow(nsWindowPtr); - if (!isKeyWindow) { - CWrapper.NSWindow.makeKeyAndOrderFront(nsWindowPtr); - } else { - CWrapper.NSWindow.orderFront(nsWindowPtr); - } - if (target instanceof Frame) { - if (((Frame)target).getExtendedState() == Frame.ICONIFIED) { - CWrapper.NSWindow.miniaturize(nsWindowPtr); - } - } - return; - } - - if (target instanceof Frame) { - if (((Frame)target).getExtendedState() == Frame.ICONIFIED) { - CWrapper.NSWindow.deminiaturize(nsWindowPtr); - } - } - - CWrapper.NSWindow.orderOut(nsWindowPtr); - } - /* * Find image to install into Title or into Application icon. * First try icons installed for toplevel. If there is no icon
26-01-2012

EVALUATION Looks like we have to postpone the CPlatformWindow.setWindowState() operation until the window gets shown.
26-01-2012