【问题标题】:Positioning a JPanel in a JFrame at specific position将 JPanel 定位在 JFrame 中的特定位置
【发布时间】:2013-11-25 15:08:41
【问题描述】:

我需要帮助将 JPanel 定位到 Jframe 中的特定位置。

我在一个扩展 JFrame 的类中有一个 JPanel,我需要把这个 JPanel 放在一个特定的 x,y 位置。

是这样的:

public class Frame extends JFrame {

    public Frame(){

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocation(250, 250);
        this.setSize(300,300);
        this.setVisible(true);

        JPanel panel = new JPanel();
        this.add(panel);
        panel.setLocation(150, 150);
        panel.add(new JButton("Hello!")); // just to show JPanel

    }//Frame()
}//Frame

对于 JPanel 的位置,我不需要 LayoutManager,因为我需要将该 JPanel 放在特定位置(例如示例中的 150,150)。 但是,如果我像上面的代码那样执行 panel.setLocation(150,150),则什么也不会发生,并且 JPanel 仍位于框架的北中心(如果我更改 x,y 数字而不是 150,150)。

它显示如下:

http://i.imgur.com/Te3z0kv.png

【问题讨论】:

标签: java swing jpanel


【解决方案1】:

在框架的内容面板中,布局管理器默认为BorderLayout (NWSE+C)。做:

this.getContentPanel().setLayout(null);

【讨论】:

  • 使用绝对定位的容器创建容器可能会在调整包含容器的窗口大小时导致问题。 docs.oracle.com/javase/tutorial/uiswing/layout/none.html
  • @Graffio31, I need to put that JPanel in a specific position (like 150,150 of the example). - 这不是使用空布局的理由。硬编码值是一个愚蠢的想法。总有更好的方法来做到这一点。例如,您在面板周围放置一个EmptyBorder。任何建议使用空布局的人都应该投反对票。使用空布局会导致很多问题,尤其是对于不了解 Swing 工作原理的初学者来说。
  • @Suganthan 好的,谢谢!但在我的情况下,我必须做 .setResizable(false) 所以绝对定位是可能的 whitout 问题:)
  • @Graffio31,这不是正确的解决方案。我给了你一个更好的选择。了解如何利用 Swing。无论您是否使用调整大小,使用布局管理器都是一项强大的功能。
【解决方案2】:

使用 setBounds(new Rectangle(96, 67, 98, 41)); 你可以这样做... 看例子

/**
 * This method initializes this
 *
 * @return void
 */
private void initialize() {
    this.setSize(300, 200);
    this.setContentPane(getJContentPane());
    this.setTitle("JFrame");
}

/**
 * This method initializes jContentPane
 *
 * @return javax.swing.JPanel
 */
private JPanel getJContentPane() {
    if (jContentPane == null) {
        jContentPane = new JPanel();
        jContentPane.setLayout(null);
        jContentPane.add(getLoginButton(), null);
    }
    return jContentPane;
}

}

【讨论】:

    【解决方案3】:

    JFrame 对象默认使用边框布局管理器,而 JPanel 默认使用框架布局管理器。 如果你想使用绝对定位,那么你必须使用 null 布局,因为任何其他布局管理器都会根据自己的心情使用 setLocation() 和 setSize() 方法,而不是根据你想要的方式。

    总结:使用 setLayout(null) 并使用 null manager 然后使用 setBounds(X,Y,width,height) 方法。

    【讨论】:

    • -1 这个糟糕的建议是在 20 分钟前提出的。没有必要用重复的建议把论坛弄得一团糟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    相关资源
    最近更新 更多