35

特定のアクションが実行されたときにポップアップ ウィンドウを生成するボタンを備えた Java スイング アプリケーションがあります。レンダリング時に、ポップアップ ウィンドウの中心点を親ウィンドウの中心点に合わせたいと思います。setLocation()ポップアップ ウィンドウに接続する x、y 座標を計算するにはどうすればよいですか?

明確にするために。setLocationRelativeTo()ポップアップの左上のピクセルが親フレームの中央のピクセルの上に設定されるため、の動作は望ましくありません。親フレームの中心ピクセルの上にポップアップの中心ピクセルを設定したい。

4

5 に答える 5

62

作成したもので、最初に呼び出し、次に、、次にをJDialog呼び出す必要があります。この順序では、は親フレームの中央に表示されます。pack()setLocationRelativeTo(parentFrame)setVisible(true)JDialog

最初に電話をかけないと、その時点でのサイズがわからないpack()ため、親を基準にした場所の設定は正しく機能しません。JDialogサイズは0x0のように見えます。その結果、他の回答の1つへのコメントで言及されている「親の中央のピクセルの上にポップアップの左上のピクセル」が配置されます。

于 2012-05-14T17:38:02.257 に答える
54

setLocationRelativeTo..これにより、ポップアップの左上のピクセルが親の中央のピクセルの上に設定されます。..

いいえ、違います!

中央のダイアログ

この簡単な例で表示される3つのダイアログはそれぞれ、私が見る限り中央に配置されているように見えます。コードが間違った時間に呼び出していると推測することしかできません。setLocationRelativeTo

import javax.swing.*;

class CenterTheDialog {

    CenterTheDialog() {
        for (int ii=1; ii<4; ii++) {
            JFrame f = new JFrame("Frame " + ii);
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

            f.setSize(400,300);
            f.setLocationByPlatform(true);
            f.setVisible(true);

            JDialog d = new JDialog(f);
            d.setSize(300,200);
            d.setLocationRelativeTo(f);
            d.setVisible(true);
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new CenterTheDialog();
        });
    }
}
于 2012-04-05T21:13:04.647 に答える
5

Window#setLocationRelativeTo

于 2012-04-05T14:57:43.237 に答える
3

イベントeを利用して親ウィンドウを取得できます。とを使用getWindowAncestore.getSource()ます。

dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))

于 2016-07-28T20:40:14.787 に答える
2

親ウィンドウの座標とそのサイズを新しいウィンドウに渡し、各軸の座標 + 1/2 親フレーム サイズ - ポップアップ x/y の 1/2 を中央に追加してみてください。

または..拡張する場合は、 setLocationRelativeTo(owner) を使用できます

お役に立てれば

于 2012-04-05T15:00:23.350 に答える