2014-01-07 51 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));