2013-08-05 57 views
3

我使用從數據庫中讀取的動態內容填充GridBagLayout JPanel。我的問題是如果我能找到一種方法來設置最後一列權重爲1.0。 Usualy當我創建靜態GridBagLayout的面板,我可以做這樣的事情:GridBagLayout行權重

GridBagLayout gbl_accPanel = new GridBagLayout(); 
    gbl_accPanel.columnWeights = new double[]{1.0}; 
    gbl_accPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0}; 
    accPanel.setLayout(gbl_accPanel); 

但現在,在我的情況,我不知道我有多少行都會有,所以我需要一種方法來推動所有的內容在頂部,這意味着使最後一行的權重爲1.0來填充我的容器的其餘部分。

很明顯,我可以保留一個計數我添加的元素,比設置rowWeights,比revalidate();重繪();但我不喜歡這種方式。那麼有沒有更好的方法?

這裏是一個圖片,如果我的問題不清楚: enter image description here

什麼,我現在做的:

public void setAccountRowWeights(int n) 
{ 
    weights = new double[n]; 
    for(int i=0; i<n-1; ++i) 
     weights[i] = 0.0; 
    weights[n-1] = 1.0; 
    gbl_accPanel.rowWeights = weights; 
} 
+0

我可以將weighty = 1.0添加到最後一個組件,但它仍然很好,但我必須自己確定最後一個組件。我在考慮是否可以設置gridbaglayout,以便我的最後一個組件將始終自動填充容器的其餘部分。 – Chris

+0

對我而言,問題仍不清楚。您是否希望所有組件對於給定記錄在「X軸」上佔據相同的空間?如果是的話,那麼你可以簡單地將組件的數量分成'1.0 /(double)noOfComponents',以獲得每個組件的'weightx'值。如果沒有,那麼你可以嘗試'GridBagConstraints.REMAINDER'作爲最後一個組件。雖然如果您可以提供所需的小圖,那可能對了解情況有更多的幫助:-) –

回答

2

如果您不需要GridBagLayout其他任何特殊功能,你可以改爲使用BorderLayout,其中「北」部分是具有未指定行數的嵌入式GridLayout(即「行數」參數爲0)。

public class LayoutTest implements Runnable { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new LayoutTest()); 
    } 

    @Override 
    public void run() { 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setLayout(new BorderLayout()); 

     JPanel north = new JPanel(new GridLayout(0, 1)); 
     for (int i = 0; i < 5; ++i) { 
      JPanel p = new JPanel(); 
      p.setPreferredSize(new Dimension(0, 25)); 
      p.setBorder(new LineBorder(Color.BLACK, 1)); 
      p.setBackground(Color.WHITE); 
      north.add(p); 
     } 
     f.add(north, BorderLayout.NORTH); 

     JPanel center = new JPanel(); 
     center.setBackground(Color.RED); 
     f.add(center, BorderLayout.CENTER); 

     f.setSize(400, 400); 
     f.setVisible(true); 
    } 
} 
+0

謝謝準備。如果我可以用BorderLayout完成所有的工作,我可能會採用這種方法。 :) – Chris