Java 多重网格约束?

Java 多重网格约束?,java,gridbaglayout,Java,Gridbaglayout,我有点困惑,是否可能有多个GridBagConstraints 我有两个使用GridBagLayout的面板,它们都受相同的约束影响。这给了我一个问题,当涉及到将较小的组件放在较大的组件旁边时,如下图所示。左侧面板的大小意味着该行的单元格非常大,位于右侧面板及其组件的中心。我曾尝试对每个面板使用单独的约束,但我没有看到任何差异,我认为我做错了什么 如何实现相邻放置的两个面板,但每个面板的组件是否受单独约束的影响 以下是我目前拥有的: 创建时使用: // layout GridB

我有点困惑,是否可能有多个
GridBagConstraints

我有两个使用GridBagLayout的面板,它们都受相同的约束影响。这给了我一个问题,当涉及到将较小的组件放在较大的组件旁边时,如下图所示。左侧面板的大小意味着该行的单元格非常大,位于右侧面板及其组件的中心。我曾尝试对每个面板使用单独的约束,但我没有看到任何差异,我认为我做错了什么

如何实现相邻放置的两个面板,但每个面板的组件是否受单独约束的影响

以下是我目前拥有的:

创建时使用:

    // layout
    GridBagConstraints c = new GridBagConstraints();

    // components
    JPanel supplier = new JPanel(new GridBagLayout());

    // grab the suppliers
    Suppliers.Supplier[] suppliers = new Suppliers.Supplier[Suppliers.supplier.size()];
    for (int i = 0; i < Suppliers.supplier.size(); i++) {
        suppliers[i] = Suppliers.supplier.get(i);
    }

    JPanel resultsPanel = new JPanel();
        JScrollPane scrollpane = new JScrollPane(resultsPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
            scrollpane.setPreferredSize(new Dimension(120, 300));

        // style properties
            c.gridx = 0;
            c.gridy = 0;
            c.insets = new Insets(10, 10, 10, 10);

    supplier.add(scrollpane, c);

    int position = 0;

    for (int i = 0; i < Suppliers.supplier.size(); i++) {


        b_supplierSuppliers.add(new JButton(suppliers[i].getName()));
            b_supplierSuppliers.get(i).setActionCommand(suppliers[i].getId());
            b_supplierSuppliers.get(i).addActionListener(this);

        // style properties
           c.gridx = 0;
           c.gridy = position;
           c.insets = new Insets(10, 10, 10, 10);
           c.gridwidth = 1;

        resultsPanel.add(b_supplierSuppliers.get(i), c);

        position++;

    }

    JPanel resultsPaneltwo = new JPanel(new GridBagLayout());

    // style properties
        c.gridx = 1;
        c.gridy = 0;

    supplier.add(resultsPaneltwo, c);

    // code label
    l_supplierCode = new JLabel("Supplier Code");

        // style properties
            c.gridx = 1;
            c.gridy = 0;
            c.insets = new Insets(0, 10, 10, 10);
            c.gridwidth = 4;
            c.fill = 4;

        resultsPaneltwo.add(l_supplierCode, c);
//布局
GridBagConstraints c=新的GridBagConstraints();
//组成部分
JPanel供应商=新的JPanel(新的GridBagLayout());
//抓住供应商
供应商.Supplier[]供应商=新供应商.Supplier[供应商.Supplier.size()];
对于(int i=0;i
然而,我追求的是:


非常感谢您的帮助。

首先,回答您最初的问题。是的,您应该为每个组件使用不同的
GridBagConstraints
对象。但是,值得注意的是,为每个组件创建新的约束并不是必不可少的,在将约束指定给其他组件后对约束的更改不会影响早期组件的位置。因此,为了可读性和以后的调试,声明多个约束是值得的,但不是必需的

此外,看起来您需要为右侧单元格上的约束指定一个
权重
。默认情况下,单元格在任何空闲空间中居中。为了指定额外空间的放置位置(垂直表示y,水平表示x),需要为约束指定一个权重值

c.weighty = 1;
这将使所有额外的垂直空间分配给该单元的约束,并因此将单元推到顶部。如果创建第二个约束并执行以下操作

c2.weighty = 1;
额外的空间将均匀分布在这两个单元格的约束之间。我希望这会有所帮助。让我知道你进展如何

这位官员表示,以下是关于体重属性的信息:

weightx,weighty

指定权重是一门艺术,它可以具有 对GridBagLayout组件外观的重大影响 控制。权重用于确定如何将空间分布在 列(权重x)和行间(权重y);这对我们来说很重要 指定大小调整行为。除非指定至少一个非零 值为weightx或weighty时,所有组件在 容器的中心。这是因为当权重为0.0时 默认情况下),GridBagLayout在其 单元格和容器的边缘

通常,指定权重的极端值为0.0和1.0: 根据需要使用介于两者之间的数字。较大的数字表明 组件的行或列应获得更多空间。对于每一列, 重量与为组件指定的最高重量X有关 在该列中,每个多列组件的重量为 以某种方式在组件所在的列之间拆分。同样,每个 行的权重与为行指定的最高权重相关 该行中的组件。额外的空间倾向于朝向目标 最右边的列和最下面的行


请把面板的图片放进去。它的外观。第二张图片正是你想要的@ShihabSoft。请务必阅读整个问题。如果这个问题已经解决,不要忘记接受并投票表决一个答案。如果目前没有一个答案可以胜任,你可以发布自己的答案并接受。这有助于将来可能偶然发现您的问题的任何人。:)另外,顺便说一句,我已经有一段时间没有使用
GridBagLayout
。如果有人发现这个答案有任何必要的修改,请告诉我,以便我可以更正。谢谢您快速而详细的回复。您的建议以及面板上的achor=GridBagConstraints.NORTH修复了该问题。非常感谢。