web-dev-qa-db-ja.com

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は「スプラッシュスクリーン」のように見えます。それらが消えてrealGUIが表示されるのを待ち続けます!

Java 1.5から Window.setLocationByPlatform(boolean) 。which ..にアクセスできました。

次回ウィンドウが表示されるときに、このウィンドウをネイティブウィンドウシステムのデフォルトの場所に表示するか、現在の場所(getLocationによって返される)に表示するかを設定します。この動作は、プログラムで場所を設定せずに表示されるネイティブウィンドウに似ています。 ほとんどのウィンドウシステムは、場所が明示的に設定されていない場合、ウィンドウをカスケードします。ウィンドウが画面に表示されると、実際の場所が決定されます。

OSによって選択されたデフォルトの位置に3つのGUIを配置するこの例の効果をご覧ください-Windows 7、GnomeおよびMac OS Xを搭載したLinux。

Stacked windows on Windows 7enter image description hereStacked windows on Mac OS X

(3ロット)3つのGUIがきちんと積み重ねられています。これは、OSがデフォルトのプレーンテキストエディターの3つのインスタンスを配置する方法であるため、エンドユーザーにとっては「最も驚きの少ない道」を表します(または、その他の点)。 LinuxとMacのtrashgodに感謝します。画像。

使用する簡単なコードは次のとおりです。

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();
            }
        });
    }
}
165
Andrew Thompson

setLocationByPlatform(true)が新しいJFrameの位置を指定する最も良い方法であることに完全に同意しますが、dual-monitor setupで問題が発生する可能性があります。私の場合、子JFrameは「もう一方の」モニターに生成されます。例:画面2にメインGUIがあり、setLocationByPlatform(true)で新しいJFrameを起動し、画面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);
5
Axel Podehl