中心JDialog超过父级

Chr*_*ier 29 java layout user-interface swing jframe

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

只是为了澄清.我不想要的行为,setLocationRelativeTo()因为它将弹出窗口的左上角像素设置在父帧的中心像素上.我想将弹出窗口的中心像素设置在父帧的中心像素上.

MB.*_*MB. 57

JDialog你创建你应该调用pack(),然后再setLocationRelativeTo(parentFrame),再setVisible(true).使用该顺序,JDialog应该以父框架为中心.

如果您不pack()先调用,则设置相对于父项的位置无法正常工作,因为JDialog它不知道该点的大小.它似乎将大小设为0乘0,这导致在对其他答案之一的评论中提到的"父母的中心像素上的弹出窗口的左上角像素"定位.


And*_*son 47

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();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

  • *...在错误的时间调用`setLocationRelativeTo`.*:是的,我在`pack()之前调用它! (10认同)