2012-09-12 26 views
1

我目前有一個JButtons數組,我想將它們放在兩列中的JPanel上,均勻分割​​。所以如果數組中有8個按鈕,左列將會有4個按鈕,右列將會有4個按鈕。但是,如果數組中有7個按鈕,則左列將包含4個按鈕,右列將包含3個按鈕。如何在兩列之間動態添加動態分配的組件?

我開始研究併爲這種情況創建了一些基本邏輯,並想知道我所做的代碼是否存在邏輯錯誤(或者可能是更好的方法)。

這裏是代碼,我拿出

public class SwingTest { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 

     JButton b1 = new JButton(); 
     b1.setText("Button1"); 

     JButton b2 = new JButton(); 
     b2.setText("Button2"); 

     JButton b3 = new JButton(); 
     b3.setText("Button3"); 

     JButton b4 = new JButton(); 
     b4.setText("Button4"); 

     JButton b5 = new JButton(); 
     b5.setText("Button5"); 

     JButton b6 = new JButton(); 
     b6.setText("Button6"); 

     ArrayList<JButton> jButtonList = new ArrayList(); 
     jButtonList.add(b1); 
     jButtonList.add(b2); 
     jButtonList.add(b3); 
     jButtonList.add(b4); 
     jButtonList.add(b5); 
     jButtonList.add(b6); 

     JPanel panel = new JPanel(); 
     panel.setLayout(new java.awt.GridBagLayout()); 

     double halfList = Math.ceil((jButtonList.size()/2.0)); 
     int gridX = 0, gridY = 0; 

     for(int i = 0; i < jButtonList.size(); i++) { 
      GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints(); 

      if(gridY == (int)halfList) { 
       gridX++; 
       gridY = 0; 
      } 
      gridBagConstraints.gridx = gridX; 
      gridBagConstraints.gridy = gridY; 
      gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH; 
      gridBagConstraints.weightx = 1.0; 
      gridBagConstraints.weighty = 1.0; 
      gridBagConstraints.insets = new java.awt.Insets(1, 0, 1, 0); 
      panel.add(jButtonList.get(i), gridBagConstraints); 
      gridY++; 
     } 
     frame.add(panel); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

的示例代碼看起來做工精細,但還能有它可能打嗝的情況下?

回答

4

您可以使用一個JPanel與GridLayout的傳遞零線在其構造與2列:

JPanel panel = new JPanel(new GridLayout(0 ,2)); 

這意味着該小組將在高度上增加當您添加組件,同時仍然保持始終爲2列

添加這些Jbutton將是如此簡單的代碼:

for(int i = 0; i < jButtonList.size(); i++) { 
    panel.add(jButtonList.get(i)); 
} 
+0

我會盡快嘗試,因爲它比我當前的代碼少得多。 - 測試過!這段代碼確實做得很好。感謝您的信息。在將此標記爲最佳答案之前,我現在在那裏的邏輯有什麼問題嗎? – WilliamShatner

+0

我對此不確定的一件事是,它按行添加按鈕而不是按列添加按鈕(還沒有決定是否希望它們按行或列添加) – WilliamShatner

+0

您的邏輯可以,只需更改FOR對於我放在這裏的panel.setLayout和panel.setLayout(新的GridLayout(0,2)應該可以工作 – Roger

1

使用此一GridBagLayout似乎是一個很好的計劃。

但是,我會清理一下按鈕構建代碼。如果你需要100個按鈕會發生什麼?手動添加100個按鈕似乎不是一個好主意。我將有一個參數化方法來構建和返回一個按鈕和一個循環,用於將按鈕添加到您的ArrayList

+0

以上只是一個SSCCE,所以其他人可以快速構建代碼,並且可能會發現上面的邏輯不會不工作,我主要想知道我的邏輯是否正確地分割列 – WilliamShatner