Java Swing:BoxLayout填充整个JPanel

Java Swing:BoxLayout填充整个JPanel,java,swing,jtree,boxlayout,Java,Swing,Jtree,Boxlayout,我正在JPanel中添加JTree项列表。我希望父JPanel具有BoxLayout,以便可以一个接一个地垂直添加树 父JPanel通过以下方式初始化: holder.setLayout(new BoxLayout(holder, BoxLayout.Y_AXIS)); holder.setMaximumSize(new java.awt.Dimension(32767, 24000)); holder.setMinimumSize(new java.awt.Di

我正在JPanel中添加JTree项列表。我希望父JPanel具有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的整个宽度,但不知怎么的,它是这样来的

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

正如您在父JPanel的某些部分中看到的那样。我希望它填充整个父面板(宽度方向),并向左对齐

编辑

在尝试了VGR提到的顶部对齐方法后,我得到了以下结果:

所以树并没有占据整个空间。当我展开任何一棵树时,一切都消失了

我还应该在前面提到,当父面板(holder)的初始化在其他类似的代码中完成时

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
此部分无法访问:(对我来说。我只能根据我的要求重新更改父持有人

建议更改VGR后的SSCCE。这是不可编译的,但我希望是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);
}

我不认为BoxLayout会让子组件填满容器。来源:

…对于垂直布局,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);
这将导致JTree垂直居中。如果希望它们顶部对齐,应在另一个面板内放置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);

尝试在JScrollPane中添加JTree,即

holder.add(new JScrollPane(tree));

检查JTree(或添加到BoxLayout中的任何其他组件)的对齐方式。更多信息。请显示。SSCCE是一个完整的类,包含导入和
main(字符串[])
,因此不可编译的代码段肯定不是SSCCE。我尝试了顶部对齐的方法,但视图仍然不正确。请查看编辑过的问题一次。您说“树没有占用整个空间,”但是在你的红色轮廓的图片中,看起来它们确实占据了整个面板的宽度,所以我不确定它有什么不正确之处。我不确定什么会导致你的其他问题;当我在一个简单的测试用例中尝试它时,它是有效的。