Java GridBagLayout不会为每行更改

Java GridBagLayout不会为每行更改,java,swing,layout,gridbaglayout,Java,Swing,Layout,Gridbaglayout,我希望三个组件的第一行以1,0.5,0.5的权重隔开。因此,第一个组件的长度应该是其他组件的两倍。在第二行中,我希望所有三个组件的重量为0.5(相同长度)GridBagLayout的行为异常 public class Main extends JFrame{ public Main() { super(); this.setLayout(new GridBagLayout()); GridBagConstraints c = new GridB

我希望三个组件的第一行以1,0.5,0.5的权重隔开。因此,第一个组件的长度应该是其他组件的两倍。在第二行中,我希望所有三个组件的重量为0.5(相同长度)
GridBagLayout
的行为异常

public class Main extends JFrame{

public Main() {
        super();

        this.setLayout(new GridBagLayout());
        GridBagConstraints c = new GridBagConstraints();

        c.fill = GridBagConstraints.HORIZONTAL;

        JLabel label = new JLabel("Label 1");
        c.weightx = 1.0;
        c.gridx = 0;
        c.gridy = 0;
        label.setBorder(BorderFactory.createLineBorder(Color.red));
        this.add(label, c);

        JLabel label2= new JLabel("Label 2");
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 0;
        label2.setBorder(BorderFactory.createLineBorder(Color.red));
        this.add(label2, c);

        JLabel label3= new JLabel("Label 3");
        c.weightx = 0.5;
        c.gridx = 2;
        c.gridy = 0;
        label3.setBorder(BorderFactory.createLineBorder(Color.red));
        this.add(label3, c);

        JLabel label4 = new JLabel("1");
        c.weightx = 0.5;
        c.gridx = 0;
        c.gridy = 1;
        label4.setBorder(BorderFactory.createLineBorder(Color.red));
        this.add(label4, c);

        JLabel label5= new JLabel("2");
        c.weightx = 0.5;
        c.gridx = 1;
        c.gridy = 1;
        label5.setBorder(BorderFactory.createLineBorder(Color.red));
        this.add(label5, c);

        JLabel label6= new JLabel("3");
        c.weightx = 0.5;
        c.gridx = 2;
        c.gridy = 1;
        label6.setBorder(BorderFactory.createLineBorder(Color.red));
        this.add(label6, c);


        this.setSize(900,900);
        this.setVisible(true);

    }
    public static void main(String[] args){
        new Main();
    }
}
我希望三个组件的第一行以1,0.5,0.5的权重隔开

“权重”仅在调整帧大小时使用。也就是说,零部件最初以其首选尺寸显示。然后,当您增加帧中的空间时,将按照指定的比率分配额外的空间

如果希望始终保持该比率,则还需要创建具有该比率中首选大小的组件

或者您可以使用。它旨在避免此问题,并允许您为每个组件指定相对大小。显然,您需要为每行创建多个面板

我希望三个组件的第一行以1,0.5,0.5的权重隔开

“权重”仅在调整帧大小时使用。也就是说,零部件最初以其首选尺寸显示。然后,当您增加帧中的空间时,将按照指定的比率分配额外的空间

如果希望始终保持该比率,则还需要创建具有该比率中首选大小的组件



或者您可以使用。它旨在避免此问题,并允许您为每个组件指定相对大小。显然,您需要为每一行创建多个面板。

GridBagLayout可能不是这种gui的最佳布局,您可能需要使用其他布局,如MigLayout。代码完全按照预期工作。对于我来说,第二行看起来与第一行完全相同row@a.kumar对不起,是的,这就是我所说的“期待”,根据您提供的代码,代码完全符合我的预期,而不是您想要的;)你知道我怎么让它做我想做的吗?因为我每次添加组件时都会更改权重x…添加带有约束的组件会在约束更改后更新组件吗?这是奇怪的GridBagLayout可能不是这种类型gui的最佳布局,您可能需要使用其他布局,如MigLayout。代码完全按照预期工作。对我来说,第二行看起来与第一行完全相同row@a.kumar对不起,是的,这就是我所说的“预期”,基于您提供的代码,代码完全按照我的预期执行,而不是您想要的;)你知道我怎么让它做我想做的吗?因为我每次添加组件时都会更改权重x…添加带有约束的组件会在约束更改后更新组件吗?这很奇怪,那么,为什么组件的大小都不一样(因为我从来没有指定一个首选的大小)?如果只是因为重量而假设首选尺寸,那么为什么第二行没有不同?每个组件都根据组件的属性确定自己的首选尺寸。鉴于文本不同,首选大小也会不同。此外,由于您有一个网格,布局必须为网格的每列设置大小。第2行和第2行上的第1列不能有不同的宽度。因此,在您的简单示例中,每列的宽度将由第一行决定,因为该行包含最大的组件。@a.kumar首选大小来自标签的文本和图标(以及其他)属性,
weightx
weighty
定义剩余空间如何分配给组件,我不知道GridBagLayout不允许列中每个组件的宽度大小不同,谢谢!组件仍然可以在列中以不同的大小显示。也就是说,除非使用“填充”属性,否则组件将以其首选大小显示。但是,列的最大宽度由列中的最大组件确定。阅读Swing教程,了解每个约束是如何工作的。那么,为什么组件的大小不尽相同(因为我从未指定过首选大小)?如果只是因为重量而假设首选尺寸,那么为什么第二行没有不同?每个组件都根据组件的属性确定自己的首选尺寸。鉴于文本不同,首选大小也会不同。此外,由于您有一个网格,布局必须为网格的每列设置大小。第2行和第2行上的第1列不能有不同的宽度。因此,在您的简单示例中,每列的宽度将由第一行决定,因为该行包含最大的组件。@a.kumar首选大小来自标签的文本和图标(以及其他)属性,
weightx
weighty
定义剩余空间如何分配给组件,我不知道GridBagLayout不允许列中每个组件的宽度大小不同,谢谢!组件仍然可以在列中以不同的大小显示。也就是说,除非使用“填充”属性,否则组件将以其首选大小显示。但是,列的最大宽度由列中的最大组件确定。阅读关于它的Swing教程,它解释了每个约束是如何工作的。