Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GridBagLayout不正确地显示元素_Java_Swing_Layout Manager_Gridbaglayout - Fatal编程技术网

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)。所以这个组显示在第一个组的正下方。有人能告诉我我做错了什么吗?

您需要在网格约束中设置gridXgridY值,否则布局管理器不知道将组件放置在何处

我认为你也把weightXweightY与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面板中。这有一个技巧,问题是我不知道将有多少组元素。我确切地知道有多少标签将在组中使用。但组的数量尚未定义。所以使用容器的静态数量对我来说不起作用。这就是为什么我想控制标签在版面中的位置。谢谢你,先生,你帮了我很多。