中心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
来获取父窗口。 使用getWindowAncestor
和e.getSource()
。
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))
您可以尝试将父窗口的坐标及其大小传递到新窗口,并在每个轴上添加坐标+ 1/2父帧大小 – 弹出窗口的1/2,以中心为中心。
或者..如果你扩展你可以使用setLocationRelativeTo(所有者)
希望这可以帮助