【问题标题】:Java: GridBagLayout unwanted spacing between adjacent x gridsJava:GridBagLayout相邻x网格之间不需要的间距
【发布时间】:2017-03-20 20:28:54
【问题描述】:

我有这个图形用户界面

我用过GridBagLayout,但我不知道为什么Plain Bread复选框和它对应的标签之间有很大的间距。

而且,我还尝试只为按钮增加沿 x 轴的间距,但尽管重置了插图,但沿 x 轴上的所有组件都增加了间距(但普通面包和之间的复选框之间的间距)标签在设置按钮的插图之前就已经存在)。

代码如下:

 public Bakery(){
    super("Bakery Bread Option");

    setLayout(new FlowLayout());
    panel.setLayout(new GridBagLayout());
    add(panel);

    GridBagConstraints gbc= new GridBagConstraints();

    gbc.insets= new Insets(4,4,4,4);

    gbc.gridx=0;
    gbc.gridy=0;
    panel.add(option_Title, gbc);


    gbc.gridx=0;
    gbc.gridy=1;
    panel.add(check_Plain, gbc);

    gbc.gridx=0;
    gbc.gridy=2;
    panel.add(qty_Plain, gbc);

    gbc.gridx=0;
    gbc.gridy=3;
    panel.add(qty_Brown, gbc);

    gbc.insets= new Insets(0,175,0,0);

    gbc.gridx=0;
    gbc.gridy=4;
    panel.add(calc_Btn, gbc);

    gbc.insets= new Insets(4,4,4,4);

    gbc.gridx=1;
    gbc.gridy=1;
    panel.add(plain_Bread, gbc);


    gbc.gridx=1;
    gbc.gridy=2;
    panel.add(qtyPlainText, gbc);

    gbc.gridx=1;
    gbc.gridy=3;
    panel.add(qtyBrownText, gbc);

    gbc.gridx=2;
    gbc.gridy=1;
    panel.add(check_Brown, gbc);

    gbc.gridx=3;
    gbc.gridy=1;
    panel.add(brown_Bread, gbc);


    calc_Amt calc_Handler= new calc_Amt();
    calc_Btn.addActionListener(calc_Handler);

}

编辑:

这是我打算实现的 GUI:

【问题讨论】:

  • 你想要实现什么 GUI?请考虑同时发布有效的minimal reproducible example。此外,顺便说一句,但您的代码忽略了 weightx、weighty、fill 和锚点 GridBagConstraints。
  • @HovercraftFullOfEels “你想要实现什么 GUI?” 至少提供 ASCII 艺术或 GUI 的预期布局的简单绘图大小,如果可调整大小,则具有更多的宽度和高度。顺便说一句,JCheckBox 可以有一个String 来标识选项,所以我认为不需要单独的JLabel 标识符。此外,由于每种类型的面包似乎都有一个“数量”选项,我会将它们初始化为 0(在 JSpinner 中)并完全丢失复选框。
  • GridBagLayout 你想要的不是矫枉过正吗?在我看来,BoxLayout 的面板每个都用 FlowLayout 布置是合适的。
  • “我打算实现的 GUI 图片” 鉴于“可调整大小”按钮未禁用,建议可以将其拉伸得更大。额外的空间是如何分配的?

标签: java swing gridbaglayout


【解决方案1】:

Plain Bread 复选框与其对应的标签之间有很大的间距。

因为组件被添加到不同的列。

列的宽度由列中最大组件的宽度决定。所以文本组件决定了列的宽度,而不是标签。

如果您希望标签/复选框在一起,您可以创建一个 JPanel 并将两个组件添加到面板中。然后将面板添加到 gridbaglayout。

或者您可以让两个文本字段使用 2 的 columnWidth,这意味着它们将跨越两列。

【讨论】:

  • 只是一个细节,在这种情况下是不是真的是计算按钮和左插入的 175 一起决定了第 0 列的宽度?