将 JDialog 居中于父级之上
Posted
技术标签:
【中文标题】将 JDialog 居中于父级之上【英文标题】:Center JDialog over parent 【发布时间】:2012-04-19 07:57:18 【问题描述】:我有一个带有按钮的 Java swing 应用程序,当执行某个操作时,该按钮会生成一个弹出窗口。我想在渲染时将弹出窗口的中心点与父窗口的中心点对齐。如何计算 x,y 坐标以插入setLocation()
以用于弹出窗口?
只是为了澄清。我不想要setLocationRelativeTo()
的行为,因为它将弹出窗口的左上角像素设置在父框架的中心像素之上。我想将弹出窗口的中心像素设置在父框架的中心像素上。
【问题讨论】:
安德鲁说实话!您应该考虑使用JDialog
而不是JFrame
。
它实际上是一个jdialog。但是对于这种特殊情况真的很重要吗?我只需要计算 x 和 y。
【参考方案1】:
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();
);
【讨论】:
...在错误的时间调用setLocationRelativeTo
。:是的,我在pack()
之前调用它!【参考方案2】:
您可以利用事件e
来获取父窗口。使用getWindowAncestor
和e.getSource()
。
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))
【讨论】:
【参考方案3】:在您创建的JDialog
上,您应该先调用pack()
,然后调用setLocationRelativeTo(parentFrame)
,然后再调用setVisible(true)
。使用该顺序,JDialog
应该出现在父框架的中心。
如果您不首先调用pack()
,那么设置相对于父级的位置将无法正常工作,因为JDialog
不知道此时它的大小。它似乎将大小设为 0 x 0,这导致在对其他答案之一的评论中提到的“弹出窗口的左上角像素位于父级中心像素之上”的位置。
【讨论】:
【参考方案4】:您可以尝试将父窗口的坐标及其大小传递给新窗口,并在每个轴上添加坐标 + 1/2 父框架大小 - 弹出窗口 x/y 的 1/2 以中心为中心。
或者..如果你扩展你可以使用 setLocationRelativeTo(owner)
希望对你有帮助
【讨论】:
这会将弹出窗口的左上角像素设置在父级的中心像素之上。我想将弹出窗口的中心像素设置在括号的中心像素上 好吧,如果你决定遵循我的公式,你可以额外减去 x/y 弹出窗口大小的 1/2。 将您的 cmets 添加到您的答案中,我会接受。这并不完美,但我想我可能还有其他事情正在影响结果。我真的不想在这里发布我的整个项目。谢谢。 “或者..如果你扩展你可以使用 setLocationRelativeTo(owner) 但它会稍微偏离” 不需要扩展它,或者做即时计算。看我的回答。【参考方案5】:Window#setLocationRelativeTo
【讨论】:
这会将弹出窗口的左上角像素设置在父级的中心像素之上。我想将弹出窗口的中心像素设置在父级的中心像素上 @CrhsiDrappier 你确定吗?then the window is located in such a way that the center of the window coincides with the center of the component.
“你确定吗?” OP 肯定是错误的,如我的示例所示,它扩展了您的答案。 OTOH,他们似乎决心把头埋在沙子里,所以..(耸肩)以上是关于将 JDialog 居中于父级之上的主要内容,如果未能解决你的问题,请参考以下文章
java 的JDialog设置了模态为真后怎么设置居中显示啊. 我用了setLocation()和setBounds()都不行啊