web-dev-qa-db-ja.com

JFrameの場所を設定するためのベストプラクティス

Swing、または一般的なGUIプログラミングに関して、(やや哲学的な)質問があります。アプリケーションで使用されるJFrameインスタンスをどこに配置するかについて認識されているベストプラクティスはありますか?

  1. 最初のメインフレームはどこに配置する必要がありますか?常に中心にある(setLocationRelativeTo(null))?
  2. JFrameはどこに配置する必要がありますか?画面の中央にある親JFrameに対して、どこにでも配置しますか?

私はいつも、これに関するいくつかのベストプラクティス、一種の「GUIバイブル」があると思っていましたが、私は間違っているのでしょうか。

18

以下のアドバイスを組み込んだ例を次に示します。

  1. Hovercraft Full Of Eels -- プラットフォームごとに場所を設定

  2. Aardvocate AkintayoOlu-場所をシリアル化します。

しかし、さらに2つの調整を追加します。

  1. 幅/高さもシリアル化します。
  2. クローズ時にフレームが最大化されている場合、境界を取得する前にフレームが復元されます。 (私はオプションをシリアル化するアプリを嫌いますが、それを考慮していません。ユーザーはそこに座って[最大化/復元]ボタンをクリックし、なぜ何も起こらないのか疑問に思っています!

組み合わせた4つのポイントは、最高のユーザーエクスペリエンスを提供します!

import Java.awt.*;
import Java.awt.event.*;
import javax.swing.*;
import Java.util.Properties;
import Java.io.*;

class RestoreMe {

    /** This will end up in the current directory
    A more sensible location is a sub-directory of user.home.
    (left as an exercise for the reader) */
    public static final String fileName = "options.prop";

    /** Store location & size of UI */
    public static void storeOptions(Frame f) throws Exception {
        File file = new File(fileName);
        Properties p = new Properties();
        // restore the frame from 'full screen' first!
        f.setExtendedState(Frame.NORMAL);
        Rectangle r = f.getBounds();
        int x = (int)r.getX();
        int y = (int)r.getY();
        int w = (int)r.getWidth();
        int h = (int)r.getHeight();

        p.setProperty("x", "" + x);
        p.setProperty("y", "" + y);
        p.setProperty("w", "" + w);
        p.setProperty("h", "" + h);

        BufferedWriter br = new BufferedWriter(new FileWriter(file));
        p.store(br, "Properties of the user frame");
    }

    /** Restore location & size of UI */
    public static void restoreOptions(Frame f) throws IOException {
        File file = new File(fileName);
        Properties p = new Properties();
        BufferedReader br = new BufferedReader(new FileReader(file));
        p.load(br);

        int x = Integer.parseInt(p.getProperty("x"));
        int y = Integer.parseInt(p.getProperty("y"));
        int w = Integer.parseInt(p.getProperty("w"));
        int h = Integer.parseInt(p.getProperty("h"));

        Rectangle r = new Rectangle(x,y,w,h);

        f.setBounds(r);
    }

    public static void main(String[] args) {
        final JFrame f = new JFrame("Good Location & Size");
        f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        f.addWindowListener( new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                try {
                    storeOptions(f);
                } catch(Exception e) {
                    e.printStackTrace();
                }
                System.exit(0);
            }
        });
        JTextArea ta = new JTextArea(20,50);
        f.add(ta);
        f.pack();

        File optionsFile = new File(fileName);
        if (optionsFile.exists()) {
            try {
                restoreOptions(f);
            } catch(IOException ioe) {
                ioe.printStackTrace();
            }
        } else {
            f.setLocationByPlatform(true);
        }
        f.setVisible(true);
    }
}
25
Andrew Thompson

私は通常、次のように呼び出してプラットフォームに決定を任せています。

myJFrame.setLocationByPlatform(true);

これにより、ウィンドウは「ネイティブウィンドウシステムのデフォルトの場所に表示」されます。詳細については: Window API

私がいつもしていることは、メインフレームの場合は画面の中央から、子フレームの場合は親の中央から開始して、この場所を記録します。次に、ユーザーがフレームを好きな場所に移動すると、新しい場所を記録し、次にアプリを起動したときに、最後の場所を使用してフレームを配置します。

ベストプラクティスがあるかどうかは非常に主観的であるため、わかりません。

中央に配置し、ユーザーが好きな場所に変更できるようにするのが理想的なようです。

子フレームに関しては、サイズに応じて、親フレームの中央、または単に使いやすいものです。

1
Mob