gpt4 book ai didi

java - GridBagLayout 组件显示不正确的宽度

转载 作者:行者123 更新时间:2023-12-02 05:11:24 30 4
gpt4 key购买 nike

我似乎遗漏了有关 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 的网格宽度为 2,nTextField 的网格宽度为 10。我认为这些列的宽度大约相同,它们具有相同的权重。那么,为什么组件具有相同的宽度呢?为什么这些列的大小明显不同?

更新:

添加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 来解决此问题,但这仍然无法解决问题。到底发生了什么事?

最佳答案

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

gridwidth 和 gridheight 不会更改组件的布局尺寸。特别是,gridwidth=2 的组件的宽度不是是 gridwidth=1 的组件的两倍。

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

             _________________________________            |         |               |       | (gridy=0)  | gridx=1 |    gridx=2    |gridx=3|            |_________|_______________|_______|            |         |               |       |            |         |               |       | (gridy=1)  | gridx=1 |    gridx=2    |gridx=3|            |         |               |       |            |_________|_______________|_______|

gridwidth/gridheight 确定组件占用 GridBagLayout 单元格的数量。如果将 gridwidth=2 与某个组件关联,但任一网格列中都没有其他组件,则效果将与 gridwidth=1 相同,因为没有其他组件驱动列的宽度。即使 gridwidth=2 组件有两个单元格宽,这两个单元格仍然只会以足够的总宽度进行布局,以适应组件的首选大小。

关于java - GridBagLayout 组件显示不正确的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27307596/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com