web-dev-qa-db-ja.com

Java:JFrame.setLocationRelativeTo(null)がUbuntu 10.04 / gnome2.30.2とOpenJDK1.6.0_18でウィンドウを中央に配置しない

サンプルコード:

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

screenshot

これはOpenJDKのせいですか? Sunほど良くなかったと聞いたのを覚えていますが、Ubuntuの標準になったので、それに合わせて決めました。プログラムはおそらくWindowsで実行されるので、そこでチェックする必要があると思います...すでに機能している場所を壊さずに、プラットフォームに依存しない方法でこれを修正する簡単な方法はありますか?

10
captain poop

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()を使用する必要があります。

5
jjnguy
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が中央に配置されます。

20
Evan

正確さ:フレームのサイズの前に位置を設定すると、サイズが(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でうまく機能します。他のプラットフォームで試してみてください。

3
YoannFleuryDev
jFrame.validate();

validateはフレームサイズをそのままにしておくのに対し、packはフレームサイズを変更できるため、これは実際にはうまく機能します。

3
Nicholas Duchon

これは古い質問ですが、setLocationRelativeTo()は機能しますが、pack()の後に呼び出す必要があります。フレームのgetWidth()とgetHeight()は、パッキング後に異なる(正しい)値を返します。そのため、OPは中央に配置できません。

2
mrazjava

相対位置を指定する前に、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);
0
LahiruBandara

サイズを設定するだけです場所を設定します。

間違っています:

jFrame.setLocationRelativeTo(null);
jFrame.setSize(600, 600);

正解:

jFrame.setSize(600, 600);
jFrame.setLocationRelativeTo(null);

注:ウィンドウの「ジャンプ」を防ぐために、最後にsetVisible()を呼び出します。

0
trinity420