我有一个带有按钮的 Java swing 应用程序,该按钮在执行某个操作时会产生一个弹出窗口。我想在渲染时将弹出窗口的中心点与父窗口的中心点对齐。如何计算要插入setLocation()
弹出窗口的 x,y 坐标?
只是为了澄清。我不想要这种行为,setLocationRelativeTo()
因为它将弹出窗口的左上角像素设置在父框架的中心像素之上。我想将弹出窗口的中心像素设置在父框架的中心像素上。
我有一个带有按钮的 Java swing 应用程序,该按钮在执行某个操作时会产生一个弹出窗口。我想在渲染时将弹出窗口的中心点与父窗口的中心点对齐。如何计算要插入setLocation()
弹出窗口的 x,y 坐标?
只是为了澄清。我不想要这种行为,setLocationRelativeTo()
因为它将弹出窗口的左上角像素设置在父框架的中心像素之上。我想将弹出窗口的中心像素设置在父框架的中心像素上。
在JDialog
你创建的时候,你应该pack()
先调用,然后setLocationRelativeTo(parentFrame)
调用setVisible(true)
。使用该顺序,JDialog
应该出现在父框架的中心。
如果您不pack()
先调用,那么设置相对于父级的位置将无法正常工作,因为此时JDialog
不知道它的大小。它似乎将大小设为 0 x 0,这导致在对其他答案之一的评论中提到的“弹出窗口的左上角像素位于父级中心像素之上”的位置。
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();
});
}
}
您可以利用事件e
来获取父窗口。使用getWindowAncestor
和e.getSource()
。
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))
您可以尝试将父窗口的坐标及其大小传递给新窗口,并在每个轴上添加坐标 + 1/2 父框架大小 - 弹出窗口 x/y 的 1/2 以中心为中心。
或者..如果你扩展你可以使用 setLocationRelativeTo(owner)
希望这可以帮助