将 GridBagLayout 调整为 JPanel 大小

Adjusting GridBagLayout to JPanel size

我有一个关于 GridBagLayout 的问题。我正在尝试制作一个简单的计算器,并使用 GridBagLayout 将所有按钮放入按钮面板中,尽管它将所有按钮放在中间而不改变按钮的大小,这是合乎逻辑的。我可以在 GridLayout(将按钮的大小调整为 JPanel 的大小)和 GridBagLayout(这样我就可以按我想要的宽度和顺序放置它们)之间找到一些东西吗?

带布局的代码如下:

... 底部面板(){

    this.setLayout(new GridBagLayout());
    GridBagConstraints gbc = new GridBagConstraints();

    backspace = new JButton("<--");
    clean = new JButton("C");
    plusminus = new JButton("+/-");
    squareroot = new JButton("\u221A");
    divide = new JButton("/");
    percent = new JButton("%");
    multiply = new JButton("*");
    fraction = new JButton("1/x");
    minus = new JButton("-");
    plus = new JButton("+");
    dot = new JButton(".");
    equals = new JButton("=");
    zero = new JButton("0");
    one = new JButton("1");
    two = new JButton("2");
    three = new JButton("3");
    four = new JButton("4");
    five = new JButton("5");
    six = new JButton("6");
    seven = new JButton("7");
    eight = new JButton("8");
    nine = new JButton("9");


    gbc.gridx = 0;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(backspace, gbc);

    gbc.gridx = 1;
    gbc.gridy = 0;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    this.add(clean, gbc);

    gbc.gridx = 3;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(plusminus, gbc);

    gbc.gridx = 4;
    gbc.gridy = 0;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(squareroot, gbc);

    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(seven, gbc);

    gbc.gridx = 1;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(eight, gbc);       

    gbc.gridx = 2;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(nine, gbc);

    gbc.gridx = 3;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(divide, gbc);

    gbc.gridx = 4;
    gbc.gridy = 1;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(percent, gbc);

    gbc.gridx = 0;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(four, gbc);

    gbc.gridx = 1;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(five, gbc);

    gbc.gridx = 2;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(six, gbc);

    gbc.gridx = 3;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(multiply, gbc);

    gbc.gridx = 4;
    gbc.gridy = 2;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(fraction, gbc);

    gbc.gridx = 0;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(one, gbc);

    gbc.gridx = 1;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(two, gbc);

    gbc.gridx = 2;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(three, gbc);

    gbc.gridx = 3;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(minus, gbc);

    gbc.gridx = 4;
    gbc.gridy = 3;
    gbc.gridwidth = 1;
    gbc.gridheight = 2;
    gbc.fill = GridBagConstraints.VERTICAL;
    this.add(equals, gbc);

    gbc.gridx = 0;
    gbc.gridy = 4;
    gbc.gridwidth = 2;
    gbc.gridheight = 1;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    this.add(zero, gbc);

    gbc.gridx = 2;
    gbc.gridy = 4;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(dot, gbc);

    gbc.gridx = 3;
    gbc.gridy = 4;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    this.add(plus, gbc);




}

结果是:

Calculator

谢谢!

这里至少是朝着正确方向迈出的一步:创建 GridBagConstraints 对象后,将其权重设置为严格大于 0:

    gbc.weightx = 0.1;
    gbc.weighty = 0.1;

选择哪个值并不重要,只要大于 0.0 且不大于 1.0 即可。这会导致您的大多数按钮水平拉伸以填充可用 space 并垂直均匀分布:

您可能已经意识到,如果您希望按钮随面板变大,您可以使用 gbc.fill = GridBagConstraints.BOTH;