web-dev-qa-db-ja.com

親の上にセンターJDialog

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

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

29
Chris Drappier

setLocationRelativeTo ..thisは、親の中央ピクセルの上にポップアップの左上のピクセルを設定します。 ..

いいえ、違います!

Centered Dialog

この簡単な例で表示される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();
        });
    }
}
47
Andrew Thompson

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

最初にpack()を呼び出さないと、JDialogはその時点でのサイズがわからないため、親に対する相対位置の設定は正しく機能しません。サイズは0 x 0のように見えるため、他の回答の1つへのコメントで言及されている「親の中心ピクセル上のポップアップの左上ピクセル」の位置になります。

56
MB.
5
Jeffrey

イベントeを利用して、親ウィンドウを取得できます。 getWindowAncestorおよびe.getSource()を使用します。

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

3
sixtytrees