Java特定のアクションが実行されたときにポップアップウィンドウを生成するボタンを備えたSwingアプリケーションがあります。ポップアップウィンドウの中心点を親の中心点に合わせたいポップアップウィンドウのsetLocation()
にプラグインするx、y座標を計算するにはどうすればよいですか?
明確にするだけです。 setLocationRelativeTo()
の動作は、ポップアップの左上のピクセルを親フレームの中央のピクセルに設定するため、望ましくありません。ポップアップの中心ピクセルを親フレームの中心ピクセルに設定したい。
setLocationRelativeTo
..thisは、親の中央ピクセルの上にポップアップの左上のピクセルを設定します。 ..
いいえ、違います!
この簡単な例で表示される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();
});
}
}
作成したJDialog
で、最初にpack()
を呼び出し、次にsetLocationRelativeTo(parentFrame)
を呼び出し、次にsetVisible(true)
を呼び出す必要があります。この順序では、JDialog
は親フレームの中央に表示されます。
最初にpack()
を呼び出さないと、JDialog
はその時点でのサイズがわからないため、親に対する相対位置の設定は正しく機能しません。サイズは0 x 0のように見えるため、他の回答の1つへのコメントで言及されている「親の中心ピクセル上のポップアップの左上ピクセル」の位置になります。
イベントe
を利用して、親ウィンドウを取得できます。 getWindowAncestor
およびe.getSource()
を使用します。
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))