Java GridBagLayout不正确地显示元素
我目前正在编写一个测试函数,它可以在单击按钮时动态地将元素添加到Java GridBagLayout不正确地显示元素,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,我目前正在编写一个测试函数,它可以在单击按钮时动态地将元素添加到JPanel。我使用的是GridBagLayout。以下是我的函数代码: public void buildGui(){ ConnectionInfoPanel.removeAll(); //test first group of items listOfLabels.add(new JLabel("Label 1")); listOfLabels.add(new JLabe
JPanel
。我使用的是GridBagLayout
。以下是我的函数代码:
public void buildGui(){
ConnectionInfoPanel.removeAll();
//test first group of items
listOfLabels.add(new JLabel("Label 1"));
listOfLabels.add(new JLabel("Label 2"));
listOfLabels.add(new JLabel("Label 3"));
listOfLabels.add(new JLabel("Label 4"));
GridBagConstraints c = new GridBagConstraints();
c.weightx = 1;
c.weighty = 1;
c.insets = new Insets(10,10,10,10);
c.anchor = GridBagConstraints.NORTHWEST;
ConnectionInfoPanel.add(listOfLabels.get(0), c);
ConnectionInfoPanel.add(new JLabel(), c);
ConnectionInfoPanel.add(listOfLabels.get(1), c);
ConnectionInfoPanel.add(new JLabel(), c);
ConnectionInfoPanel.add(listOfLabels.get(2), c);
ConnectionInfoPanel.add(new JLabel(), c);
ConnectionInfoPanel.add(listOfLabels.get(3), c);
ConnectionInfoPanel.add(new JLabel(), c);
//test second group
listOfLabels.add(new JLabel("Label 5"));
listOfLabels.add(new JLabel("Label 6"));
listOfLabels.add(new JLabel("Label 7"));
listOfLabels.add(new JLabel("Label 8"));
GridBagConstraints x = new GridBagConstraints();
x.weightx = 1;
x.weighty = 2;
x.insets = new Insets(10,10,10,10);
// x.anchor = GridBagConstraints.NORTHWEST;
ConnectionInfoPanel.add(listOfLabels.get(4), x);
ConnectionInfoPanel.add(new JLabel(), x);
ConnectionInfoPanel.add(listOfLabels.get(5), x);
ConnectionInfoPanel.add(new JLabel(), x);
ConnectionInfoPanel.add(listOfLabels.get(6), x);
ConnectionInfoPanel.add(new JLabel(), x);
ConnectionInfoPanel.add(listOfLabels.get(7), x);
ConnectionInfoPanel.add(new JLabel(), x);
ConnectionInfoPanel.updateUI();
}
在第一组元素中,一切正常。它们从左上角(0,0)排列成直线
但在第二组元素中,它们的起始位置成为面板的中心(Y轴)和Label4的末端(X轴)。但我试图实现的是将他们的起始位置设置为(0,1)。所以这个组显示在第一个组的正下方。有人能告诉我我做错了什么吗?您需要在网格约束中设置gridX和gridY值,否则布局管理器不知道将组件放置在何处 我认为你也把weightX和weightY与gridX和gridY混淆了。这是两件不同的事情 对于每个组件,按如下方式重置约束:
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = 0;
ConnectionInfoPanel.add(listOfLabels.get(0), c);
c.gridx++;
ConnectionInfoPanel.add(listOfLabels.get(1), c);
c.gridx++;
ConnectionInfoPanel.add(listOfLabels.get(2), c);
c.gridx++;
ConnectionInfoPanel.add(listOfLabels.get(3), c);
c.gridx = 0;
c.gridy = 1;
ConnectionInfoPanel.add(listOfLabels.get(4), c);
c.gridx++;
ConnectionInfoPanel.add(listOfLabels.get(5), c);
c.gridx++;
ConnectionInfoPanel.add(listOfLabels.get(6), c);
c.gridx++;
ConnectionInfoPanel.add(listOfLabels.get(7), c);
如果您不知道列表有多长,那么需要添加一些循环,这些循环将不断增加y
或者,您可以将这两行添加到两个flowlaout面板,然后将其添加到gridbaglaout面板,如下所示:
JPanel panel1 = new JPanel();
panel1.add(listOfLabels.get(0));
panel1.add(listOfLabels.get(1));
panel1.add(listOfLabels.get(2));
panel1.add(listOfLabels.get(3));
ConnectionInfoPanel.add(panel1, c);
JPanel panel2 = new JPanel();
panel2.add(new JLabel("Label 5"));
panel2.add(new JLabel("Label 6"));
panel2.add(new JLabel("Label 7"));
panel2.add(new JLabel("Label 8"));
GridBagConstraints x = new GridBagConstraints();
x.weightx = 1;
x.weighty = 2;
x.insets = new Insets(10, 10, 10, 10);
// x.anchor = GridBagConstraints.NORTHWEST;
x.gridy = 0;
ConnectionInfoPanel.add(panel1, x);
x.gridy = 1;
ConnectionInfoPanel.add(panel2, x);
这使得标签变得疯狂,到处可见。我试过了,不幸的是我失去了对元素的控制。但是layoutmanager需要知道你想把元素放在哪里。您还可以尝试将两组标签放在两个flowLayout面板中,然后将它们作为两个元素添加到gridbaglayout面板中。这有一个技巧,问题是我不知道将有多少组元素。我确切地知道有多少标签将在组中使用。但组的数量尚未定义。所以使用容器的静态数量对我来说不起作用。这就是为什么我想控制标签在版面中的位置。谢谢你,先生,你帮了我很多。