【发布时间】: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