[java] Swing GUI를 가장 잘 배치하는 방법?

다른 스레드 나는 이런 식으로 뭔가를 수행하여 내 GUI를 중심 좋아 밝혔다 :

JFrame frame = new JFrame("Foo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new HexagonGrid());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);

그러나 앤드류 톰슨은 다른 의견을 가지고 대신

frame.pack();
frame.setLocationByPlatform(true);

질문하는 사람들은 왜 그런지 알고 싶어?



답변

내 눈에, 화면 중간에 GUI가 그렇게 보인다. “splash-screen’ish”. 나는 그들이 사라지고 실제 GUI가 나타날 때까지 계속 기다리고 있습니다 !

Java 1.5부터 우리는에 액세스했습니다 Window.setLocationByPlatform(boolean). 어느..

다음에 윈도우가 표시 될 때이 윈도우가 기본 윈도우 시스템의 기본 위치에 표시되는지 또는 현재 위치 (getLocation에 의해 반환 됨)에 표시되어야하는지 설정합니다. 이 동작은 프로그래밍 방식으로 위치를 설정하지 않고 표시된 기본 창과 유사합니다. 대부분의 윈도우 시스템은 위치가 명시 적으로 설정되지 않은 경우 계단식으로 배열됩니다. 창이 화면에 표시되면 실제 위치가 결정됩니다.

Windows 7, Linux, Gnome & Mac OS X에서 OS가 선택한대로 3 개의 GUI를 기본 위치에 배치하는이 예제의 효과를 살펴보십시오.

Windows 7의 누적 창 여기에 이미지 설명을 입력하십시오
Mac OS X에서 쌓인 창

3 개의 GUI가 깔끔하게 쌓여 있습니다. 이것은 OS가 기본 일반 텍스트 편집기 (또는 그 문제에 대한 다른 것)의 3 개의 인스턴스를 배치하는 방법이기 때문에 최종 사용자에게는 ‘최소한의 놀라움의 길’을 나타냅니다. Linux 및 Mac의 휴지통에 감사드립니다. 이미지.

사용 된 간단한 코드는 다음과 같습니다.

import javax.swing.*;

class WhereToPutTheGui {

    public static void initGui() {
        for (int ii=1; ii<4; ii++) {
            JFrame f = new JFrame("Frame " + ii);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            String s =
                "os.name: " + System.getProperty("os.name") +
                "\nos.version: " + System.getProperty("os.version");
            f.add(new JTextArea(s,3,28));  // suggest a size
            f.pack();
            // Let the OS handle the positioning!
            f.setLocationByPlatform(true);
            f.setVisible(true);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater( new Runnable() {
            public void run() {
                try {
                    UIManager.setLookAndFeel(
                        UIManager.getSystemLookAndFeelClassName());
                } catch (Exception useDefault) {}
                initGui();
            }
        });
    }
}


답변

setLocationByPlatform(true)새로운 JFrame의 위치를 ​​지정하는 가장 좋은 방법이지만 이중 모니터 설정에서는 문제가 발생할 수 있음 에 동의합니다 . 필자의 경우 자식 JFrame이 ‘다른’모니터에 생성됩니다. 예 : 화면 2에 기본 GUI가 있고 새 JFrame을 시작하고 setLocationByPlatform(true)화면 1에서 열립니다. 그래서 더 완벽한 해결책은 다음과 같습니다.

...
// Let the OS try to handle the positioning!
f.setLocationByPlatform(true);
if (!f.getBounds().intersects(MyApp.getMainFrame().getBounds())) {
    // non-cascading, but centered on the Main GUI
    f.setLocationRelativeTo(MyApp.getMainFrame()); 
}
f.setVisible(true);


답변