Swing、または一般的なGUIプログラミングに関して、(やや哲学的な)質問があります。アプリケーションで使用されるJFrame
インスタンスをどこに配置するかについて認識されているベストプラクティスはありますか?
setLocationRelativeTo(null)
)?JFrame
はどこに配置する必要がありますか?画面の中央にある親JFrame
に対して、どこにでも配置しますか?私はいつも、これに関するいくつかのベストプラクティス、一種の「GUIバイブル」があると思っていましたが、私は間違っているのでしょうか。
以下のアドバイスを組み込んだ例を次に示します。
Hovercraft Full Of Eels -- プラットフォームごとに場所を設定 。
しかし、さらに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);
}
}
私は通常、次のように呼び出してプラットフォームに決定を任せています。
myJFrame.setLocationByPlatform(true);
これにより、ウィンドウは「ネイティブウィンドウシステムのデフォルトの場所に表示」されます。詳細については: Window API
私がいつもしていることは、メインフレームの場合は画面の中央から、子フレームの場合は親の中央から開始して、この場所を記録します。次に、ユーザーがフレームを好きな場所に移動すると、新しい場所を記録し、次にアプリを起動したときに、最後の場所を使用してフレームを配置します。
ベストプラクティスがあるかどうかは非常に主観的であるため、わかりません。
中央に配置し、ユーザーが好きな場所に変更できるようにするのが理想的なようです。
子フレームに関しては、サイズに応じて、親フレームの中央、または単に使いやすいものです。