2011-09-13 4 views
9

다음 스윙 코드가 내 컴퓨터 또는 내 동료 기계 (모든 Windows XP & 자바 6)에서 제대로 작동하지 않습니다JFrame.setExtendedState (MAXIMIZED_BOTH)가 장식되지 않은 프레임에서 작동합니까?

public class Test { 
    public static void main(String[] args) { 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setSize(800, 600); 
     frame.setLayout(new FlowLayout()); 
     frame.add(new JButton(new AbstractAction("Maximize") { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH); 
      } 
     })); 
     frame.setUndecorated(true); 
     frame.setVisible(true); 
    } 
} 

그것은 창을 최대화,하지만 고려 Windows 작업 고려하지 않습니다 바 (화면을 채 웁니다). "frame.setUndecorated (true);"를 주석 처리하면 올바르게 작동하는 것 같습니다.

Javadoc은 이것이 작동해야 함을 암시하는 것으로 보입니다. 이것은 Java의 버그입니까? 특정 릴리스 또는 Windows 버전으로 제한됩니까? 해결 방법이 있습니까?

나는 few workarounds을 보았지만 불완전한 것처럼 보입니다. Java에서 내 자신의 프레임 장식을 코딩하는 첫 번째 사람이 될 수 없습니다.

편집

:은 오픈 JDK를 다운로드하고 네이티브 코드를 통해 파고 후, 나는 자바는 Win32 함수 SetWindowPlacement를 호출하고 어떤 조건에서 우측 창 크기를 얻을 수 MINMAXINFO을 변경하는 것을 발견했다. 내가 뭘보고 있었는지 제목이나 테두리가없는 윈도우에 대한 기본 윈도우 동작 (비록 내가 어디서나 그 문서화 찾을 수 없습니다) 생각합니다. JFrame.setMaximizedBounds()를 호출하면 win32 MINMAXINFO 구조체를 변경하는 데 사용되는 경계가 제공된다는 것을 알았습니다. 그래서 내 작업이 수행 변경 내 MaximizedBounds 등 camickr 제안 창 크기를 사용하여, 나는 조금 더 가까이 얻을 :

GraphicsConfiguration graphicsConfiguration = frame.getGraphicsConfiguration(); 
frame.setMaximizedBounds(graphicsConfiguration.getBounds()); 
frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH); 

지금 창 최대화가 더 이상 도구 모음을 숨 깁니다. 하지만 .. 지금 또 다른 문제가 있습니다. 보조 모니터에서 최대화 할 수 없습니다. 프레임이 사라집니다.

이 문제를 인식하는 C++ 프로그래머를 얻기 위해 win32 태그를 추가하려고합니다.

해결 방법 : 분명히 내 자신의 질문에 대답 할 수 없기 때문에 여기에 해결책을 제시 할 것입니다. 나는 일 클래스를 사용했고, 나는 윈도우 이외의 플랫폼에서 그것을 테스트하지 않은,하지만 지금까지 여러 모니터 및 여러 작업 표시 줄의 구성과 잘 작동하는 것 같군 :

GraphicsConfiguration config = frame.getGraphicsConfiguration(); 
Rectangle usableBounds = SunGraphicsEnvironment.getUsableBounds(config.getDevice()); 
frame.setMaximizedBounds(new Rectangle(0, 0, usableBounds.width, usableBounds.height)); 
frame.setExtendedState((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH ? JFrame.NORMAL : JFrame.MAXIMIZED_BOTH); 
+0

이 포럼에 http://download.oracle.com/javase/tutorial/extra/fullscreen/exclusivemode.html에 대한 스레드가 많이 있습니다. – mKorbel

+0

고맙지 만 전체 화면 앱을 만들려고하고 있지 않습니다. . 아마 내 목표에 대해 분명히해야하지만 운영 체제 제목 표시 줄 및 제어 도구를 Google 크롬, Microsoft Office 등과 같이 내 자신의 것으로 대체하려고합니다. Sun은 한 번 상자에서이 작업을 시도해 보았지만 동일한 문제가 발생했습니다. 'frame.getRootPane(). setWindowDecorationStyle (JRootPane.FRAME);' –

답변

4

흥미 롭. 그것을 시도 할 때 그것은 두 단계로 일어나는 것으로 보인다. 첫 번째는 작업 표시 줄 위에있는 공간을 채우기 위해 펼쳐집니다. 그런 다음 나중에 두 번째로 작업 표시 줄을 덮습니다. 나는 이유를 모른다.

어쨌든 해결을 위해 다음을 사용할 수 있습니다

GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
Rectangle bounds = env.getMaximumWindowBounds(); 
System.out.println("Screen Bounds: " + bounds); 

수동으로 프레임의 경계를 설정하는 당신이 그것을 극대화하고자 할 때.

+0

그게 더 가까워지는 것 같지만, 프레임은 확장 상태를 '정상'으로 재설정합니다. 내 프레임 하위 클래스를 만들고 내 확장 상태와 이전 경계를 추적 할 수 있지만 운영 체제는이 시뮬레이션 상태를 인식하지 못하고 미묘한 방법으로 나를 배신 할 것입니다.또한 여러 모니터에서 창 테두리를 가져 오는 방법을 찾아야합니다. –

+0

그것은 경계를 추적하고 자신을 진술하는 아이디어였습니다. 나는 그 미묘한 문제들이 더 이상 조언을 해줄 수 없다는 것을 모른다. 필자는 결코 그것을 해본 적이 없지만 여러 모니터의 경우'GraphicsDevice' 클래스를 볼 수 있습니다. – camickr

관련 문제