在Java Swing中从左上角开始使用GridBagLayout布局

14

我刚接触Java Swing,一直在努力让GridBagLayout从左上角开始,这样c.gridx=0 c.gridy=0就能把我的对象放在左上角。

如果您能告诉我需要在此之后做些什么,我会非常感激。

    JPanel panel = new JPanel(new GridBagLayout());
    frame.add(panel);
    GridBagConstraints c = new GridBagConstraints();

我知道我需要使用NORTHWEST或FIRST_LINE_START常量,但我不知道如何使用。我尝试了这种方式,但它没有实现常量。

    frame.getContentPane().add(panel, BorderLayout.NORTHWEST);

谢谢您的帮助。

6个回答

16

请阅读 Swing 教程中有关如何使用 GridBagLayout的章节。"weightx,weighty"部分说明:

除非您至少为 weightx 或 weighty 指定一个非零值,否则所有组件都会在其容器的中心聚集在一起。


感谢澄清;Mark的帖子帮助我理解了这个问题。 - Emir
这正是我所需要的 - 谢谢。我不想在框架内部面板的布局上玩游戏。通过我的GridBagConstraints设置的几行额外代码,这个方法非常有效。太好了。 - tsm

14

你需要使用GridBagConstraintsanchor属性。以下代码可以帮助你实现:

frame.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.anchor = GridBagConstraints.NORTHWEST;
frame.add(panel, gbc);

我不能保证你在设置约束对象时不需要设置其他属性才能获得所需的布局。特别是,您可能需要将 weightxweighty 设置为 1,以便该面板占用其分配到的所有可用空间。


@Emir: 你可以这样做,虽然我发现将面板保留在与包含它的帧不同的类中通常很好。如果这样做,您甚至真的不需要扩展JFrame,您只需要将面板添加到一个完整的JFrame中。如果您使用frame.add()frame.setLayout()等,那么这样做就是将调用委托给一个名为“内容面板”的特殊面板。 - Mark Peters
@MarkPeters,不使用Frame能实现吗?我将GridBagLayout嵌入到DeckLayout中,而Frame对我来说并不是很适用。如果您能提供任何帮助,那将非常感激。我已经厌倦了与布局玩耍(我和原始帖子的作者有完全相同的问题)。 - john_science
@theJollySin:GridBagLayout 可以在任何 JPanel 中使用,只需使用 new GridBagLayout() 构造面板即可。它们之间的交互可能有点棘手。如果遇到问题,请发布一个新的问题。 - Mark Peters

6
一种快速简单的方法是:在页面末尾添加一个空的JLabel。
    // your code goes here
    gbc.weightx = 1;
    gbc.weighty = 1;

    bg.add(new JLabel(" "), gbc);  // blank JLabel

完美地工作了。注意:在代码的最后,在添加空白JLabel之前使用gbc.weightx=1和gbc.weighty=1非常重要。这样它就不会应用于所有组件,而只应用于空白JLabel。 - viniciussss

5

对于那些使用集成开发环境(例如NetBeans)的人,我终于找到了一个好方法:如果您想添加组件到顶部并使用它们的首选大小,请添加另一个weighty = 1.0的空面板。从自动生成的代码(NetBeans)中复制:

gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.weighty = 1.0;
jPanelOptions.add(jPanelFiller, gridBagConstraints);

5

有一个解决方法。您可以将GridBagLayout面板放置在具有BorderLayout.NORTH的BorderLayout面板中。然后,GridBagLayout面板中的组件将从顶部位置开始。

static void test4(){
    JFrame frame = new JFrame("Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(480, 360);

    JPanel borderLayoutPanel=new JPanel(new BorderLayout());
    JPanel gridBagLayoutPanel = new JPanel(new GridBagLayout());
    borderLayoutPanel.add(gridBagLayoutPanel, BorderLayout.NORTH);
    frame.add(borderLayoutPanel);

    JButton testButton=new JButton("test button");
    GridBagConstraints c = new GridBagConstraints();
    c.gridx=0;
    c.gridy=0;
    gridBagLayoutPanel.add(testButton, c);

    frame.setVisible(true);
}

enter image description here


2
如果您希望网格延伸到顶部,只需将所有的weighty设置为0,直到最后一个项目,将其设置为任何大于0的数字,它将有效地将其余的按钮推向顶部。
不要忘记递增您的按钮的gridy值。
否则它将居中。 (如果您没有使用c.fill = GridBagConstraints.HORIZONTAL属性,则可以使用gridx和weightx值执行相同的操作。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接