2014-10-06 54 views
0

我目前正在編寫一個測試函數,它在按鈕單擊時動態地將元素添加到JPanel中。我正在使用GridBagLayout。這裏是我的功能的代碼: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)。

但在第2組元素的它們的起始位置成爲面板的中心(在Y軸)和結束Label4的(沿X軸)。但我想要實現的是將其起始位置設置爲(0,1)。所以這個小組直接顯示在第一個下面。任何人都可以告訴我我做錯了什麼?

回答

1

您需要設置網格限制爲gridxgridY值或佈局管理器不知道放在哪裏的組件。

我覺得你也很困惑weightX and weightY with gridX and 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); 
+0

這使得標籤發瘋,顯示所有的地方。我試過了,不幸的是我鬆散地控制了元素。 – iColdBeZero 2014-10-06 07:09:52

+0

但layoutmanager不知何故需要知道你想放置元素的位置。您也可以嘗試將兩組標籤放在兩個flowLayout面板中,然後將這兩個標籤添加到一個gridbaglayout面板中。 – 2014-10-06 07:13:36

+0

看到我更新的答案 – 2014-10-06 07:20:37