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);

しかし、Andrew Thompsonは別の見方をしており、代わりに

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

そして探究心はなぜ知りたいのですか?


GUIは前回終了した場所と同じ場所で開始する必要があります。
NomadMaker

回答:


167

私の目には、画面の中央にあるGUIは "splash-screen'ish"に見えます。それらが消えて本物の GUIが表示されるのを待ち続けます!

Java 1.5以降、にアクセスしてきましたWindow.setLocationByPlatform(boolean)。どっち?

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

OSが選択したデフォルトの位置に3つのGUIを配置するこの例の効果を見てください-Windows 7では、GnomeとMac OS Xを搭載したLinux。

Windows 7の積み上げウィンドウ ここに画像の説明を入力してください 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();
            }
        });
    }
}

1
@AndrewThompsonなぜカウンタ変数iiだけではなく変数なのiですか?それはある慣習に準拠していますか、それとも個人的な好みですか(または、まったく異なるものでしょうか)?
MirroredFate 14年

1
@MirroredFateうーん..私はそこにオプション3を固定すると思います。これは、Basicで最初にプログラムしたとき(そう、昔)に慣れたものでした。怠惰であることは、継続して使用する理由です。「破損していない場合は、修正しないでください」。
Andrew Thompson

1
@MirroredFateたまたまプリンスオブペルシャファンですか?ここに入れてすみません。私はただ抵抗
できませんでした

11
@MirroredFate ii代わりにを使用する理由は次のとおりですi。プログラミングのコンテストに参加するときは、ループインデックスを検索して、たとえばそこから、+1または-1そこから、1つのエラーで修正する必要があります。このような場合、どのエディタを使用したかに関係なく、ii検索はを検索するよりもはるかに簡単ですi。同様に、ネストされたループインデックスにjjand を使用しkkています。:)
musically_ut

5

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