Java GridBagLayout组件显示的宽度不正确
我似乎遗漏了一些关于GridBagLayout的基本内容。我试图指定标签的宽度应为2个单位,文本字段的宽度应为10个单位 下面的代码模仿了我正在做的部分工作。它显示的文本字段和标签的宽度大致相同。我遗漏了什么或做得不对Java GridBagLayout组件显示的宽度不正确,java,swing,user-interface,gridbaglayout,Java,Swing,User Interface,Gridbaglayout,我似乎遗漏了一些关于GridBagLayout的基本内容。我试图指定标签的宽度应为2个单位,文本字段的宽度应为10个单位 下面的代码模仿了我正在做的部分工作。它显示的文本字段和标签的宽度大致相同。我遗漏了什么或做得不对 package numbers; import javax.swing.*; import java.awt.*; public class FooBar extends JFrame { public static void main(String[] args)
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。我认为这些列的宽度应该与它们的权重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));
_________________________________
| | | |
(gridy=0) | gridx=1 | gridx=2 |gridx=3|
|_________|_______________|_______|
| | | |
| | | |
(gridy=1) | gridx=1 | gridx=2 |gridx=3|
| | | |
|_________|_______________|_______|
我认为这可以通过添加
weightx=gridwidth来更改helper方法cs来解决代码>但这仍然不能解决问题。到底发生了什么?每个子组件的容器宽度分布由权重x决定。分配给gridwidth的值应改为分配给weightx。对于所有组件,gridwidth应为1(或余数)
gridwidth和gridheight不会更改构件的布局尺寸。特别是,gridwidth=2的组件的宽度不是gridwidth=1的组件的两倍
尽管名称中有“网格”一词,但GridBagLayout的单元格大小并不完全相同;它们只是排列在一起。如果绘制线来显示每个单元格,GridBagLayout可能如下所示:
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));
_________________________________
| | | |
(gridy=0) | gridx=1 | gridx=2 |gridx=3|
|_________|_______________|_______|
| | | |
| | | |
(gridy=1) | gridx=1 | gridx=2 |gridx=3|
| | | |
|_________|_______________|_______|
_________________________________
| | | |
(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组件有两个单元格宽,但这两个单元格的总宽度仍仅足以容纳组件的首选尺寸。您所说的“2个单元”是什么意思?什么是单位?只是两个组件的比率应为2:10。使用weightx
代替,允许值介于0和1之间,技术上,weightx值不需要介于0和1之间;它们总是相对的。2和10是可接受的权重x值。好的。这开始变得更有意义了。但是,问题是:我试图在其他组件下面添加一个按钮。我不希望它只占据第一列,因为我不希望它调整第一列的大小。这可能吗?使用两列(即gridwidth=2)是有意义的,但这不起作用。是的,对于应该跨越所有其他单元格的组件,将gridwidth设置为1以外的值是正确的。