中心JDialog超过父级

时间:2012-04-05 14:53:37

标签: java swing layout user-interface jframe

我有一个带有按钮的Java swing应用程序,当执行某个操作时会生成一个弹出窗口。我想在弹出窗口的中心点与渲染时父窗口的中心点对齐。如何为弹出窗口计算插入setLocation()的x,y坐标?

只是澄清一下。我不希望setLocationRelativeTo()的行为,因为它将弹出窗口的左上角像素设置在父框架的中心像素上。我想将弹出窗口的中心像素设置在父帧的中心像素上。

5 个答案:

答案 0 :(得分:51)

在您创建的JDialog上,您应首先致电pack(),然后致电setLocationRelativeTo(parentFrame),然后致setVisible(true)。使用该顺序,JDialog应显示在父框架的中心。

如果您没有先调用pack(),则设置相对于父级的位置无法正常工作,因为JDialog不知道该点的大小。它似乎将大小设置为0乘0,这导致在对其他答案之一的评论中提到的“父级中心像素上的弹出窗口的左上角像素”定位。

答案 1 :(得分:47)

  

setLocationRelativeTo ..这会将弹出窗口的左上角像素设置在父级的中心像素上。 ..

不,不是!

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

答案 2 :(得分:5)

答案 3 :(得分:3)

您可以使用事件e来获取父窗口。使用getWindowAncestore.getSource()

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

答案 4 :(得分:2)

您可以尝试将父窗口的坐标及其大小传递到新窗口,并在每个轴上添加坐标+ 1/2父帧大小 - 弹出窗口的1/2,以中心为中心。 / p>

或..如果你扩展,你可以使用setLocationRelativeTo(所有者)

希望这有帮助