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


126

다른 스레드 나는 이런 식으로 뭔가를 수행하여 내 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는 지난번에 끝난 곳에서 시작해야합니다.
20:03에 NomadMaker

답변:


167

내 눈에, 화면 중간에 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();
            }
        });
    }
}

1
@AndrewThompson 왜 카운터 변수가 ii아닌 변수 i입니까? 그것은 어떤 규약을 따르고 있습니까? 아니면 개인적인 취향입니까 (아니면 완전히 다른 것입니까)?
MirroredFate

1
@MirroredFate Umm .. 옵션 3을 "전적으로 다른 것"으로 고정 할 것입니다. 내가 Basic에서 처음 프로그래밍 할 때 익숙해졌습니다 (오래 전에). 게으름 때문에 계속 사용하는 이유가 '파산하지 않으면 고치지 마십시오'입니다.
Andrew Thompson

1
@MirroredFate 페르시아 팬의 왕자입니까? 여기에 넣어서 정말 죄송합니다. 방금 저항 할 수
없었습니다

11
@MirroredFate 여기에 내가 ii대신 사용 하는 이유 가 i있습니다. 내가 대회 프로그램에 참여할 때, 나는 종종 말에 루프 인덱스를 검색 할 수 있고, +1또는 -1그것에서 하나의 오류로 떨어져 수정. 이 경우 검색 한 편집기에 관계없이 ii검색하는 것이 검색하는 것보다 훨씬 쉽습니다 i. 마찬가지로, 내가 사용 jj하고 kk중첩 된 루프 인덱스. :)
musically_ut

5

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.