将 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 来获取父窗口。使用getWindowAncestore.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 居中于父级之上的主要内容,如果未能解决你的问题,请参考以下文章

JFileChooser 作为 JDialog 父级

拖动未修饰的 jDialog

java 的JDialog设置了模态为真后怎么设置居中显示啊. 我用了setLocation()和setBounds()都不行啊

JDialog 不可见

制作一个显示“请稍候”JDialog 的摆动线程

如何限制 JDialog 的尺寸