【问题标题】:GridBagLayout components display incorrect widthGridBagLayout 组件显示不正确的宽度
【发布时间】:2014-12-05 02:03:24
【问题描述】:

我似乎遗漏了一些关于 GridBagLayout 的基本知识。我试图指定一个标签应该是 2 个单位宽,而一个文本字段应该是 10 个单位宽。

以下代码模仿了我正在做的部分事情。它显示文本字段和标签占用大约相同的宽度。我错过了什么或做错了什么?

package numbers;

import javax.swing.*;
import java.awt.*;

public class FooBar extends JFrame {
    public static void main(String[] args) {
        new FooBar();
    }
    FooBar() {
        super("Foobar");
        setSize(600,100);

        JPanel panel = new JPanel();
        setLayout(new GridBagLayout());

        JLabel nLabel = new JLabel("Foo");
        JTextField nTextField = new JTextField("Bar");

        GridBagConstraints c = new GridBagConstraints();

        add(nLabel,         cs(0,  0,  2, 1, c.CENTER, c.NONE));
        add(nTextField,     cs(2,  0, 10, 1, c.CENTER, c.HORIZONTAL));

        add(panel);
        setVisible(true);
    }

    private GridBagConstraints cs(int gridx, int gridy,
            int gridwidth, int gridheight,
            int anchor, int fill) {
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = gridx;
        c.gridy = gridy;
        c.gridwidth = gridwidth;
        c.gridheight = gridheight;
        c.anchor = anchor;
        c.fill = fill;

        c.weightx = 1;
        c.weighty = 1;
        return c;
    }
}

我以为我已经指定 nLabel 的 gridwidth 为 2,而 nTextField 的 gridwidth 为 10。我认为这些列的宽度大致相同,它们具有相同的 weightx。那么,为什么这些组件具有相同的宽度?为什么这些列的大小明显不同?

更新:

添加 weightx = 2 和 weightx = 10 似乎可以解决这个问题……但它在更大的上下文中不起作用。我正在使用的代码如下所示:

    add(intro1,         cs(0,  0, 12, 1, c.WEST,    c.NONE));
    add(intro2,         cs(0,  1, 12, 1, c.WEST,    c.NONE));
    add(nLabel,         cs(0,  3,  2, 1, c.CENTER,  c.NONE));
    add(nTextField,     cs(2,  3, 10, 1, c.CENTER,  c.HORIZONTAL));
    add(nthFoundLabel,  cs(0,  4,  3, 1, c.CENTER,  c.NONE));
    add(nFoundText,     cs(2,  4, 10, 1, c.CENTER,  c.HORIZONTAL));
    add(blankLine,      cs(0,  5, 12, 1, c.CENTER,  c.HORIZONTAL));
    add(startButton,    cs(0,  6,  6, 1, c.CENTER,  c.NONE));
    add(stopButton,     cs(6,  6,  6, 1, c.CENTER,  c.NONE));
    add(blankLine,      cs(0,  7, 12, 1, c.CENTER,  c.BOTH));
    add(progressLabel,  cs(0,  8, 12, 1, c.CENTER,  c.NONE));
    add(lastFoundLabel, cs(0,  9,  3, 1, c.CENTER,  c.NONE));
    add(lastFoundText,  cs(3,  9,  9, 1, c.CENTER,  c.HORIZONTAL));
    add(lastNText,      cs(3, 10,  9, 1, c.CENTER,  c.HORIZONTAL));
    add(elapsedLabel,   cs(0, 11,  3, 1, c.CENTER,  c.HORIZONTAL));
    add(remainingLabel, cs(0, 12,  3, 1, c.CENTER,  c.HORIZONTAL));
    add(progressBar,    cs(0, 13, 12, 1, c.CENTER,  c.HORIZONTAL));

我认为这可以通过添加 weightx = gridwidth; 更改辅助方法 cs 来解决,但这仍然不能解决问题。到底是怎么回事?

【问题讨论】:

  • “2 个单位”是什么意思?什么单位?
  • 只是两个组件的比例应该是 2:10。
  • 改用weightx,允许值介于0和1之间
  • 从技术上讲,weightx 值不需要介于 0 和 1 之间;它们总是相互关联的。 2 和 10 是可接受的 weightx 值。

标签: java swing user-interface gridbaglayout


【解决方案1】:

容器宽度对每个子组件的分布由 weightx 决定。您分配给 gridwidth 的值应该分配给 weightx 。所有组件的网格宽度都应为 1(或 REMAINDER)。

gridwidth 和 gridheight 不会改变组件的布局大小。特别是,gridwidth=2 的组件是 gridwidth=1 的组件的两倍。

尽管名称中有“Grid”一词,但 GridBagLayout 的单元格大小并不相同;它们只是对齐在一起。如果您画线来显示每个单元格,GridBagLayout 可能如下所示:

_________________________________ | | | | (网格=0)|网格 = 1 |网格=2 |网格=3| |_________|_______________|_______| | | | | | | | | (网格=1)|网格 = 1 |网格=2 |网格=3| | | | | |_________|_______________|_______|

gridwidth/gridheight 确定有多少 GridBagLayout 的单元格被组件占用。如果将 gridwidth=2 与一个组件相关联,但任一网格列中没有其他组件,则效果将与 gridwidth=1 相同,因为没有其他组件驱动列的宽度。即使 gridwidth=2 组件有两个单元格宽,这两个单元格的布局仍然只有足够的总宽度来容纳组件的首选尺寸。

【讨论】:

  • 好的。这开始变得更有意义了。但是,问题:我正在尝试在其他组件下方添加一个按钮。我不希望它只占据第一列,因为我不希望它调整第一列的大小。这可能吗?使用两列(即gridwidth = 2)是有意义的,但这不起作用。
  • 是的,对于一个应该跨越所有其他单元格的组件,将 gridwidth 设置为 1 以外的值是正确的。
猜你喜欢
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2012-02-16
  • 1970-01-01
相关资源
最近更新 更多