Java 基于主Jframe的子Jframe的绝对位置

Java 基于主Jframe的子Jframe的绝对位置,java,swing,jframe,Java,Swing,Jframe,我有以下代码从按钮调用新帧: final JButton btnFontHelp = new JButton("Font Help"); btnFontHelp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { Framefont fr = new Framefont(); fr.setBounds

我有以下代码从按钮调用新帧:

final JButton btnFontHelp = new JButton("Font Help");
    btnFontHelp.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            Framefont fr = new Framefont();
            fr.setBounds(100, 150, 400, 170);
            fr.setVisible(true);

        }
    });
fr.setBounds(100150)是基于屏幕而非主机的绝对位置。有没有办法知道主屏幕的绝对位置,以便子帧可以基于主帧而不是屏幕的位置显示在某个位置

而不是:

fr.setBounds(100, 150, 400, 170);
试试这个:

fr.setLocationRelativeTo(parentFrame);

在ActionListener中,您可以添加如下代码:

JButton button = (JButton)arg0.getSource();
Window frame = SwingUtilities.windowForComponent( button );
Rectangle bounds = frame.getLocation();
现在,您可以使用矩形中的位置/大小信息相对于其父窗口定位子窗口


当然,如果父窗口被移动,子窗口将保留在其当前位置。如果希望子窗口移动,则需要在框架中添加一个
ComponentListener
,并处理
componentMoved()
事件以重新定位子窗口。

您好,谢谢您的回答,但它会将子框架置于父框架的中心。我想要的是将子框架放在其父框架的特定位置,例如200、300。@lionbluesky,你试过我的建议了吗?它对你有用吗?我在尝试了你的建议后发表了评论,它将新框架定位在主框架的中心。为了更快地获得更好的帮助,发布一个(最小完整的可验证示例)或(简短、自包含、正确的示例)。请看,我更喜欢像使用Jpanel一样使用多个Jframe,当我使用Miglayout时,它会导致闪烁并且不能正常工作。“…当我使用Jpanel时,它会导致闪烁…”那么你显然做错了。最好弄清楚到底出了什么问题,而不是在最终用户身上强制多帧。嗨,camickr,当我实现你的代码时,它也不起作用。事实上,矩形不能实现,应该改为点。你能提供进一步的帮助或解释吗?下面是实现您的建议后我的代码:final JButton btnFontHelp=newjbutton(“字体帮助”);btnFontHelp.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0){Framefont fr=new Framefont();fr.setBounds(100150400170);fr.setVisible(true);});下面是实现您的建议后我的代码:final JButton btnFontHelp=newjbutton(“字体帮助”);btnFontHelp.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent arg0){JButton btnFontHelp=(JButton)arg0.getSource();WindowFrame=SwingUtilities.windowForComponent(btnFontHelp);Point bounds=frame.getLocation();Framefont fr=new Framefont();fr.setBounds(100、150、400、170);fr.setVisible(true);}}});`无法实现矩形,应将其更改为点。`您需要矩形,因为您需要知道父帧的位置和大小,以便可以相对于父帧定位子帧。张贴一篇适当的文章来演示这个问题。注释中的几行代码没有帮助。