How do I auto-expand a JTree when setting a new TreeModel?

后端 未结 5 1161
抹茶落季
抹茶落季 2020-12-18 19:37

I have a custom JTree and a custom JModel; I would for the JTree to \"auto-expand\" when I give it a new model. At the moment, it simply collapse a

相关标签:
5条回答
  • 2020-12-18 20:09
    public void expandTree(){
        int row = 1;
        while (row++ < tree.getRowCount()){
            tree.expandRow(row);
        }
    
    public void collapseTree(){
        int row = tree.getRowCount() - 1;
        while (row-- > 0){
            tree.collapseRow(row);
        }
    }
    
    0 讨论(0)
  • 2020-12-18 20:26

    I had a similar problem.

    Your solution (as posted https://stackoverflow.com/a/15211697/837530) seemed to work for me only for the top level tree nodes.

    But I needed to expand all the a descendants node. So I solved it with the following recursive method:

    private void expandAllNodes(JTree tree, int startingIndex, int rowCount){
        for(int i=startingIndex;i<rowCount;++i){
            tree.expandRow(i);
        }
    
        if(tree.getRowCount()!=rowCount){
            expandAllNodes(tree, rowCount, tree.getRowCount());
        }
    }
    

    which is invoked with

    expandAllNodes(tree, 0, tree.getRowCount());
    

    where, tree is a JTree.

    Unless someone has a better solution.

    0 讨论(0)
  • 2020-12-18 20:28

    The following worked for me (called after setting the new model):

    for (int i = 0; i < tree.getRowCount(); i++) {
        tree.expandRow(i);
    }
    
    0 讨论(0)
  • 2020-12-18 20:28

    this worked for me..

    import javax.swing.*;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.TreePath;
    import javax.swing.tree.TreeNode;
    import java.awt.*;
    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.util.Enumeration;
    
    public class JTreeNodeAutoExpandCollapse extends JFrame {
        public JTreeNodeAutoExpandCollapse() throws HeadlessException {
            initializeUI();
        }
    
        private void initializeUI() {
            setSize(200, 200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root");
            DefaultMutableTreeNode chapter1 = new DefaultMutableTreeNode("Chapter 1");
            DefaultMutableTreeNode sub1 = new DefaultMutableTreeNode("1.1");
            DefaultMutableTreeNode sub2 = new DefaultMutableTreeNode("1.2");
            DefaultMutableTreeNode sub3 = new DefaultMutableTreeNode("1.3");
            DefaultMutableTreeNode sub31 = new DefaultMutableTreeNode("1.3.1");
            DefaultMutableTreeNode sub32 = new DefaultMutableTreeNode("1.3.2");
    
            root.add(chapter1);
            chapter1.add(sub1);
            chapter1.add(sub2);
            chapter1.add(sub3);
            sub3.add(sub31);
            sub3.add(sub32);
    
            final JTree tree = new JTree(root);
            expandTree(tree, false);
    
            JScrollPane pane = new JScrollPane(tree);
            pane.setPreferredSize(new Dimension(200, 200));
    
            JPanel buttonPanel = new JPanel(new BorderLayout());
            JButton expandAll = new JButton("Expand All");
            expandAll.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    expandTree(tree, true);
                }
            });
    
            JButton collapseAll = new JButton("Collapse All");
            collapseAll.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    expandTree(tree, false);
                }
            });
    
            buttonPanel.add(expandAll, BorderLayout.WEST);
            buttonPanel.add(collapseAll, BorderLayout.EAST);
    
            getContentPane().setLayout(new BorderLayout());
            getContentPane().add(pane, BorderLayout.CENTER);
            getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        }
    
        private void expandTree(JTree tree, boolean expand) {
            TreeNode root = (TreeNode) tree.getModel().getRoot();
            expandAll(tree, new TreePath(root), expand);
        }
    
        private void expandAll(JTree tree, TreePath path, boolean expand) {
            TreeNode node = (TreeNode) path.getLastPathComponent();
    
            if (node.getChildCount() >= 0) {
                Enumeration enumeration = node.children();
                while (enumeration.hasMoreElements()) {
                    TreeNode n = (TreeNode) enumeration.nextElement();
                    TreePath p = path.pathByAddingChild(n);
    
                    expandAll(tree, p, expand);
                }
            }
    
            if (expand) {
                tree.expandPath(path);
            } else {
                tree.collapsePath(path);
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new JTreeNodeAutoExpandCollapse().setVisible(true);
                }
            });
        }
    }
    
    0 讨论(0)
  • 2020-12-18 20:29

    There's also this non-recursive version.

    private void expandAllNodes(JTree tree) {
        int j = tree.getRowCount();
        int i = 0;
        while(i < j) {
            tree.expandRow(i);
            i += 1;
            j = tree.getRowCount();
        }
    }
    
    0 讨论(0)
提交回复
热议问题