【问题标题】:Center JDialog over parent将 JDialog 居中于父级之上
【发布时间】:2012-04-19 07:57:18
【问题描述】:

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

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

【问题讨论】:

  • 安德鲁说实话!您应该考虑使用JDialog 而不是JFrame
  • 它实际上是一个jdialog。但是对于这种特殊情况真的很重要吗?我只需要计算 x 和 y。

标签: java swing layout user-interface jframe


【解决方案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】:

      【讨论】:

      • 这会将弹出窗口的左上角像素设置在父级的中心像素之上。我想将弹出窗口的中心像素设置在父级的中心像素上
      • @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,他们似乎决心把头埋在沙子里,所以..(耸肩)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 2012-02-16
      • 2017-09-20
      • 1970-01-01
      • 2013-03-04
      • 2020-02-11
      相关资源
      最近更新 更多