我有点困惑,是否可以有多个 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);
但是我在追求:
非常感谢任何帮助。
答案 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指定的最高权重相关 该行中的组件。额外的空间倾向于走向 最右边的列和底行。