多个GridBagConstraints?

时间:2014-04-17 13:53:03

标签: java gridbaglayout

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

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

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

以下是我目前的情况:

enter image description here

创建于:

    // 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);

但是我在追求:

enter image description here

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

首先,回答你的初步问题。是的,您应该为每个组件使用不同的GridBagConstraints个对象。但值得注意的是,为每个组件创建新的必不可少,并且在将约束分配给另一个组件后对约束的更改不会影响早期组件&# 39;位置因此,为了便于阅读和后续调试,值得声明多个约束,但这并不重要。

此外,您似乎需要在右侧单元格上为约束指定weighty。默认情况下,单元格以任何备用空间为中心。为了指定放置额外空间的位置(垂直于y,水平放置x ),您需要为约束赋予权重值;

c.weighty = 1;

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

c2.weighty = 1;

额外的空间将在这两个单元格的约束之间平均分配。我希望这会有所帮助。让我知道你是怎么过的。

官方Oracle GridBagLayout guide在权重属性上说了以下内容;

  

weightx,重量

     

指定权重是一种可以拥有的权重   GridBagLayout对组件外观的重大影响   控制。权重用于确定如何分配空间   列(weightx)和行(weighty);这很重要   指定调整大小的行为。除非您指定至少一个非零   weightx或weighty的值,所有组件聚集在一起   他们的容器中心。这是因为当重量是0.0(   默认情况下,GridBagLayout在其网格之间放置任何额外的空格   细胞和容器的边缘。

     

一般来说,权重指定为0.0和1.0作为极值:   必要时使用其间的数字。数字越大表示   组件的行或列应该获得更多空间。对于每列,   权重与为组件指定的最高权重x相关   在该列中,每个多列组件的权重都是   在某个组件所在的列之间以某种方式分开。同样,每个   行的权重与为a指定的最高权重相关   该行中的组件。额外的空间倾向于走向   最右边的列和底行。