【发布时间】:2015-02-04 10:39:17
【问题描述】:
我在让 Java 的 Swing 布局管理器正常运行时遇到了一些麻烦。这是我第一次尝试创建自己的 GUI,所以我可能只是错过了一些相当简单的东西,但我希望能提供任何建议。
我要创建的是一个自定义 JPanel,其中包含 JLabels 和 JTextFields 以允许用户输入 IP 地址(因此四个 JTextFields 与三个包含“。”的 JLabel 间隔)
我发现很难找到可以按照我的意愿进行设置的布局管理器;我尝试了 Flow 和 Box 布局,但由于这些都不起作用,我还尝试了 GridBag,我认为这可能是矫枉过正,但即使这样也不能正常工作。
这是我开始上课的代码:
public class PingPanel extends JPanel {
private JLabel[] dotLabels;
private JTextField[] pingFields;
public PingPanel() {
Dimension dim = getPreferredSize();
dim.width = 400;
setPreferredSize(dim);
dotLabels = new JLabel[3];
for (int i = 0; i < dotLabels.length; i++) {
dotLabels[i] = new JLabel(".");
}
pingFields = new JTextField[4];
for (int i = 0; i < pingFields.length; i++) {
pingFields[i] = new JTextField(3);
}
Border panelBorder = BorderFactory.createLineBorder(Color.BLACK);
setBorder(panelBorder);
//setupFlow();
//setupBox();
//setupGridBag();
我只将面板的宽度设置为 400 以尝试显示所有内容(稍后您会看到,我对此也不太走运。)我知道有些经理忽略了首选无论如何尺寸,这可能是为什么这不起作用。我创建了三种方法来尝试不同的布局管理器;它们在这里产生的效果:
public void setupFlow() {
for (int p = 0; p < pingFields.length; p++) {
if (p == dotLabels.length) {
add(pingFields[p]);
System.out.println(p + " (Final Column)");
}
else {
add(pingFields[p]);
add(dotLabels[p]);
System.out.println(p);
}
}
}
FlowLayout 产生这个:
这是最接近我想要的样子,但我不确定为什么我只得到一个 JTextField 和一个标签。
public void setupBox() {
Container pingBox = Box.createHorizontalBox();
for (int p = 0; p < pingFields.length; p++) {
if (p == dotLabels.length) {
pingBox.add(pingFields[p]);
System.out.println(p + " (Final Column)");
}
else {
pingBox.add(pingFields[p]);
pingBox.add(dotLabels[p]);
System.out.println(p);
}
}
}
这就是 BoxLayout 给我的。我真的不知道我是怎么把这个弄得这么糟糕的!
public void setupGridBag() {
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.gridy = 0;
gc.gridx = 0;
gc.weightx = 1.0;
gc.weighty = 1.0;
gc.fill = GridBagConstraints.HORIZONTAL;
add(pingFields[0], gc);
gc.gridx++;
add(dotLabels[0], gc);
gc.gridx++;
add(pingFields[1], gc);
gc.gridx++;
add(dotLabels[1], gc);
gc.gridx++;
add(pingFields[2], gc);
gc.gridx++;
add(dotLabels[2], gc);
gc.gridx++;
add(pingFields[3], gc);
}
GridBagLayout 至少为我提供了我正在寻找的布局,但我无法弄清楚如何使 JTextFields 更宽。
所以我们到了 - 我确定我的绿色只是让我错过了一些明显的东西,但如果有人有任何想法,我将非常感激。
【问题讨论】:
-
您可以将 MinimumSize 设置为默认宽度,但这也不是最好的方法。
-
我很抱歉,我没有意识到我没有提供足够的信息。
-
我已经设法解决了这个问题 - 显然删除 setPreferredSize 的代码已经使 FlowLayout 和 GridBagLayout 都能正常工作。 BoxLayout 看起来仍然很可怕,但现在无需担心。
标签: java swing gridbaglayout flowlayout boxlayout