サンプルコード:
JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);
jFrame.pack();
// jFrame.setLocationRelativeTo(null); // same results
jFrame.setVisible(true);
これはOpenJDKのせいですか? Sunほど良くなかったと聞いたのを覚えていますが、Ubuntuの標準になったので、それに合わせて決めました。プログラムはおそらくWindowsで実行されるので、そこでチェックする必要があると思います...すでに機能している場所を壊さずに、プラットフォームに依存しない方法でこれを修正する簡単な方法はありますか?
1つの方法は、ウィンドウを手動で配置することです。 pack()
を呼び出した直後に次のコードを配置します。
_Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Point middle = new Point(screenSize.width / 2, screenSize.height / 2);
Point newLocation = new Point(middle.x - (jFrame.getWidth() / 2),
middle.y - (jFrame.getHeight() / 2));
jFrame.setLocation(newLocation);
_
免責事項、これはWindowsでのみテストされました。
また、setPreferredSize()
の代わりに常にsetSize()
を使用する必要があります。
JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);
jFrame.pack();
jFrame.setVisible(true);
jFrame.setLocationRelativeTo(null); //To center the code
これにより、問題が修正され、Jframeが中央に配置されます。
正確さ:フレームのサイズの前に位置を設定すると、サイズが(0,0)であるため、ウィンドウの左上隅が中央に配置されます。場所の前にサイズを設定する必要があります。
JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setSize(600, 600);
jFrame.pack();
jFrame.setLocationRelativeTo(null);
jFrame.setVisible(true);
OpenJDK-6とUbuntu13.04でうまく機能します。他のプラットフォームで試してみてください。
jFrame.validate();
validate
はフレームサイズをそのままにしておくのに対し、packはフレームサイズを変更できるため、これは実際にはうまく機能します。
これは古い質問ですが、setLocationRelativeTo()は機能しますが、pack()の後に呼び出す必要があります。フレームのgetWidth()とgetHeight()は、パッキング後に異なる(正しい)値を返します。そのため、OPは中央に配置できません。
相対位置を指定する前に、jFrameサイズを宣言しないでください。そうすると、iFrameが指定された場所から離れてしまいます。
これは間違っています - -
JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);
jFrame.pack();
jFrame.setVisible(true);
これは正しいです - -
JFrame jFrame = new JFrame("Test");
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//size comes first
jFrame.setSize(600, 600);
//and then the position
jFrame.setLocationRelativeTo(null);
jFrame.pack();
jFrame.setVisible(true);
サイズを設定するだけです前場所を設定します。
間違っています:
jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);
正解:
jFrame.setSize(600, 600);
jFrame.setLocationRelativeTo(null);
注:ウィンドウの「ジャンプ」を防ぐために、最後にsetVisible()を呼び出します。