12

我是 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);

谢谢你的帮助。

4

6 回答 6

16

阅读 Swing 教程中有关如何使用 GridBagLayout的部分。关于“weightx,weighty”的部分指出:

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

于 2011-06-16T03:32:38.557 回答
14

您需要使用您GridBagConstraints的 'anchor属性。这应该为你做:

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

我不保证您不必设置约束对象的其他属性来获得您想要的布局。特别是,您可能需要设置weightxweighty1使面板占用分配给它的所有可用空间。

于 2011-06-15T21:04:58.523 回答
5

对于那些使用 IDE(例如 NetBeans)的人,我终于找到了一个不错的技巧:如果您想将组件添加到顶部并使用它们的首选尺寸:添加另一个 weighty = 1.0 的空面板。从自动生成的代码 (NetBeans) 复制:

gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.weighty = 1.0;
jPanelOptions.add(jPanelFiller, gridBagConstraints);
于 2012-07-21T13:23:25.210 回答
4

一种快速简单的方法:

在页面末尾添加一个空白 JLabel:

    // your code goes here
    gbc.weightx = 1;
    gbc.weighty = 1;

    bg.add(new JLabel(" "), gbc);  // blank JLabel
于 2015-08-18T10:27:53.343 回答
4

有一个解决方法。您可以使用 BorderLayout.NORTH 将 GridBagLayout 面板放在 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);
}

在此处输入图像描述

于 2016-11-13T05:24:39.247 回答
2

如果您希望网格一直到顶部,只需将所有 weighty = 0 设置到最后一项,将其设置为大于 0 的任何数字,它将有效地将其余按钮推到顶部。

不要忘记增加按钮的网格值。

否则会居中。(如果您不使用 c.fill = GridBagConstraints.HORIZONTAL 属性,则可以使用 gridx 和 weightx 值完成相同的操作。)

于 2014-07-16T20:42:31.483 回答