Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GridBagLayout组件显示的宽度不正确_Java_Swing_User Interface_Gridbaglayout - Fatal编程技术网

Java GridBagLayout组件显示的宽度不正确

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)

我似乎遗漏了一些关于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。我认为这些列的宽度应该与它们的权重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以外的值是正确的。