2014-01-07 50 views
-2

我正在JPanel中添加JTree項目列表。我希望父JPanel擁有BoxLayout,以便樹可以一個接一個垂直添加。Swing:BoxLayout填充整個JPanel

holder.setLayout(new BoxLayout(holder, BoxLayout.Y_AXIS)); 
     holder.setMaximumSize(new java.awt.Dimension(32767, 24000)); 
     holder.setMinimumSize(new java.awt.Dimension(600, 100)); 
     holder.setPreferredSize(new java.awt.Dimension(600, 100)); 

多重JTree的組件內加入:

holder.add(tree); 

因此,我期望JTree的節點被佔用我的父JPanel的整個寬度,但

父的JPanel使用初始化不知何故它是這樣來的

enter image description here

所以你可以看到它來自父JPanel的某個部分。我希望它填充整個父面板(​​寬度方向)並向左對齊。

編輯

試圖通過VGR提到的頂端對齊方式後,我得到這個:

enter image description here

所以樹都沒有佔據整個空間依舊。當我展開任何樹,然後一切消失。

我應該也提到這早些時候,當父面板(持有人)的動初始化在一些其他的代碼做這樣

holder.setMaximumSize(new java.awt.Dimension(32767, 24000)); 
holder.setMinimumSize(new java.awt.Dimension(600, 100)); 
holder.setPreferredSize(new java.awt.Dimension(600, 100)); 
holder.setLayout(new java.awt.GridLayout(1, 0)); 
add(holder); // add to the top parent 

這部分是不可達:(我。我只能母公司持有人重新改按我的要求。

SSCCE建議之後,從VGR變化。這不是編譯但我希望SSC。

public BasePanel() extends JPanel{ 

private javax.swing.JPanel holder; 
private GridBagConstraints gbc; 
private JPanel treesPanel; 

BasePanel(){ 
    init(); 
} 

public init(){ can't access this method 
     holder.setMaximumSize(new java.awt.Dimension(32767, 25000)); 
     holder.setMinimumSize(new java.awt.Dimension(600, 0)); 
     holder.setPreferredSize(new java.awt.Dimension(600, 0)); 
     holder.setLayout(new java.awt.GridLayout(1, 0)); 
     add(holder); 
} 

public initTreeComponents(){ // i need to call this for each tree 
     this.holder.setLayout(new BorderLayout()); 
     treesPanel = new JPanel(new GridBagLayout()); 
     this.holder.add(treesPanel, BorderLayout.PAGE_START); 
     gbc = new GridBagConstraints(); 
     gbc.gridwidth = GridBagConstraints.VERTICAL; 
     gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
     gbc.fill = GridBagConstraints.HORIZONTAL; 
     gbc.weightx = 1; 
} 

public addTree(JTree tree){// to be called for each tree 
    treesPanel.add(tree,gbc); 
} 
+2

檢查JTrees的對齊(或任何其他組件你正在添加到BoxLayout)。更多信息[here](http://docs.oracle。COM/JavaSE的/教程/ uiswing /佈局/ box.html#對準)。 –

+1

請顯示[sscce](http://sscce.org)。 –

+0

SSCCE是一個完整的類,帶有導入和'main(String [])',所以不可編譯的代碼片段肯定不是SSCCE。 –

回答

2

我不認爲BoxLayout使子組件填充容器。從the documentation

...對於垂直佈局,BoxLayout會嘗試使列中的所有組件都與最寬的組件一樣寬。

所以你的JTrees都是相同的寬度,但是不能保證它們會和容器一樣寬。

相反,我會用GridBagLayout的:

holder.setLayout(new GridBagLayout()); 

// etc. 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
gbc.weightx = 1; 
holder.add(tree, gbc); 

這將導致JTrees被垂直居中。如果你希望他們頂部對齊,你應該把一個GridBagLayout的面板中的另一個面板內:

holder.setLayout(new BorderLayout()); 

JPanel treesPanel = new JPanel(new GridBagLayout()); 
holder.add(treesPanel, BorderLayout.PAGE_START); 

// etc. 

GridBagConstraints gbc = new GridBagConstraints(); 
gbc.gridwidth = GridBagConstraints.REMAINDER; 
gbc.anchor = GridBagConstraints.FIRST_LINE_START; 
gbc.fill = GridBagConstraints.HORIZONTAL; 
gbc.weightx = 1; 
treesPanel.add(tree, gbc); 
+0

我嘗試了頂端對齊的方法,但仍然不合適。請一次查看已編輯的問題。 – ayush

+0

你說「樹不佔據整個空間」,但在紅色輪廓的圖片中,它看起來確實佔據了面板的整個寬度,所以我不確定它的不正確之處。我不確定什麼會導致你的其他問題;當我在一個簡單的測試案例中嘗試它時,它會起作用。 – VGR

0

嘗試增加JTrees一個JScrollPane內,即

holder.add(new JScrollPane(tree));