中心JDialog超过父级

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

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

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

在您创建的JDialog ,您应首先调用pack() ,然后setLocationRelativeTo(parentFrame) ,然后setLocationRelativeTo(parentFrame) setVisible(true) 。 使用该顺序, JDialog应该以父框架为中心。

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

Window#setLocationRelativeTo

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

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

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

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

希望这可以帮助