Java 将JDialog置于父级之上

Java 将JDialog置于父级之上,java,swing,layout,user-interface,jframe,Java,Swing,Layout,User Interface,Jframe,我有一个Java swing应用程序,它带有一个按钮,当执行某个操作时,会生成一个弹出窗口。我希望在渲染时将弹出窗口的中心点与父窗口的中心点对齐。如何计算要插入弹出窗口的setLocation()的x,y坐标 我只是想澄清一下。我不希望出现setLocationRelativeTo()的行为,因为这会将弹出窗口的左上角像素设置在父帧的中心像素上。我想在父帧的中心像素上设置弹出窗口的中心像素 您可以尝试将父窗口的坐标及其大小传递给新窗口,并在每个轴上添加坐标+1/2父帧大小-弹出窗口x/y的1/2

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


我只是想澄清一下。我不希望出现
setLocationRelativeTo()
的行为,因为这会将弹出窗口的左上角像素设置在父帧的中心像素上。我想在父帧的中心像素上设置弹出窗口的中心像素

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

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

希望这有帮助


setLocationRelativeTo
。这会将弹出窗口的左上角像素设置在父对象的中心像素上

不,没有

在我看来,这个简单示例弹出的3个对话框中的每一个都是居中的。我只能猜测代码在错误的时间调用了
setLocationRelativeTo

import javax.swing.*;
课堂中心对话{
中心对话{
对于(int ii=1;ii{
新中心对话框();
});
}
}

在您创建的
JDialog
上,应该首先调用
pack()
,然后调用
setLocationRelativeTo(parentFrame)
,然后调用
setVisible(true)
。按照该顺序,
JDialog
应该显示在父帧的中心


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

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


dialog.setLocationRelativeTo(SwingUtilities.GetWindowSenator((组件)e.getSource())

这将弹出窗口的左上角像素设置在父对象的中心像素上。我想将弹出窗口的中心像素设置为parent@CrhsiDrappier你确定吗<代码>然后窗口的位置使窗口的中心与组件的中心重合。“确定吗?”OP肯定是错误的,如我扩展答案的示例所示。奥托,他们似乎决心把头深深埋在沙子里,所以。。(耸耸肩)这将弹出窗口的左上角像素设置在父对象的中心像素之上。我想将弹出窗口的中心像素设置在parenwell的中心像素之上,如果您决定按照我的公式,您可以再减去x/y弹出窗口大小的1/2。将您的评论添加到您的答案中,我将接受。这并不完美,但我想我可能还有其他事情在影响结果。我真的不想在这里发布我的整个项目。谢谢。”或者..如果您扩展,您可以使用setLocationRelativeTo(所有者),但它会稍微偏离“无需扩展,或进行动态计算”。看我的答案,安德鲁说的是实话!您应该考虑使用<代码> jCalue<代码>,而不是<代码> jFrase>代码>。实际上它是一个J对话框。但这真的对这个特定场景有影响吗?我所需要的只是x和y的计算。它发生在我的项目中,也许是因为其他原因。我真的很讨厌荡秋千。不管怎样,菲尔纳德的回答让我明白了(某种程度上)我在寻找的是如何计算它。我已经接受了他的答案,我正在研究下一个问题。谢谢在错误的时间调用
setLocationRelativeTo
:是的,我在
pack()
之前调用过它!
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();
        });
    }
}