setLocationRelativeTo()一个组件,然后稍微移动它

时间:2017-05-16 16:46:01

标签: java swing

我正在尝试将JDialog相对于内部JPanel中的JButton定位 - 我可以使用dialog.setLocationRelativeTo(button)来完成,但对话框会覆盖按钮。我一直在尝试,但是没有成功,然后稍微移开对话框。

我发现了一些看似有希望的不同方法,然后只产生完全相同的结果,从设置相对位置(看似相互覆盖)后的setLocation(x,y)到获得屏幕上按钮的位置。

我很擅长这种东西,并且在过去的几天里问了几个问题,但是有没有人有任何提示,比如我应该在API中寻找什么?我应该考虑将相对于组件的坐标转换为屏幕坐标吗?这是我的下一个最佳猜测...但我不会撒谎,这绝对让我感到困惑。

1 个答案:

答案 0 :(得分:3)

由于Component.getLocationOnScreen()

,您无需转换自己
public static void main(String[] args) {
    SwingUtilities.invokeLater(() -> {
        final JFrame f = new JFrame("test");
        final JButton b = new JButton("Hello");
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(b, BorderLayout.NORTH);
        f.setSize(300, 200);
        f.setVisible(true);
        b.addActionListener((e) -> {
            JDialog dialog = new JDialog(f);
            dialog.getContentPane().add(new JLabel(new Date().toString()));
            dialog.pack();
            Point point = b.getLocationOnScreen();
            //dialog.setLocationRelativeTo(b); // Shows over button, as doc says
            dialog.setLocation(new Point(point.x, point.y + b.getHeight()));
            dialog.setVisible(true);
        });
    });
}

适合我...

Window.setLocationRelativeTo(...)的文档说:

  

如果组件不为null并且显示在屏幕上,那么   窗口的位置就是窗口的中心   与组件的中心重合。

所以你得到的行为是正常的。

(希望我已正确理解你的问题)