我似乎遗漏了一些关于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.我认为这些列的宽度大约相同,它们具有相同的权重x。那么,为什么组件的宽度相同呢?为什么列显然有不同的尺寸?
更新
添加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来解决此问题,但这仍然无法解决问题。到底是怎么回事?
答案 0 :(得分:2)
每个子组件的容器宽度分布由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分量是两个单元格宽,这两个单元格仍然只有足够的总宽度来布局,以适应组件的首选大小。