Search code examples
javaswingjtree

Adding child node to parent node of JTree


I created a a JTree using Swing control and named treeWorld. Its root node is root and children namely Mammals, Birds, Reptiles, Amphibians, Insects. Now I want to add sparrow, cuckoo to Birds programmatically.

But I can't add sparrow, cuckoo to Birds.

This is my piece piece of code:

DefaultTreeModel model = (DefaultTreeModel)treeWorld.getModel();

DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();

DefaultMutableTreeNode bird = new DefaultMutableTreeNode("Birds");
DefaultMutableTreeNode sparrow = new DefaultMutableTreeNode("sparrow");

DefaultMutableTreeNode cuckoo = new DefaultMutableTreeNode("cuckoo");
bird.add(sparrow);
bird.add(cuckoo);
this.pack();
this.setVisible(true);

Solution

  • Seems problem that you never add bird node to your JTree, use root.add(bird);.

    If your root node already contain bird node, you need to search that in root and not create a new one.

    Also use model.nodesWereInserted(NODE, new int[]NODE.getChildCount()-1}); if you add new nodes to visible tree. NODE- node to which you add a new child.

    Example:

    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Enumeration;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTree;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    
    public class TestFrame extends JFrame {
    
        private JTree t;
    
        public TestFrame() {
            init();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            pack();
            setLocationRelativeTo(null);
            setVisible(true);
        }
    
        private void init() {
    
            DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
            DefaultMutableTreeNode bird = new DefaultMutableTreeNode("Birds");
            root.add(bird);
    
            DefaultTreeModel model = new DefaultTreeModel(root);
            add(t=new JTree(model));
    
            JButton btn = new JButton("add");
            btn.addActionListener(getAddListener());
    
            add(btn,BorderLayout.SOUTH);
        }
    
        private ActionListener getAddListener() {
            return new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    DefaultTreeModel model = (DefaultTreeModel)t.getModel();
                    DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
    
                    Enumeration children = root.children();
                    while(children.hasMoreElements()){
                        DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement();
                        if(node.toString().equals("Birds")){
    
                            DefaultMutableTreeNode sparrow = new DefaultMutableTreeNode("sparrow");
                            DefaultMutableTreeNode cuckoo = new DefaultMutableTreeNode("cuckoo");
    
                            node.add(sparrow);
                            node.add(cuckoo);
                            model.nodesWereInserted(node, new int[]{node.getChildCount()-1,node.getChildCount()-2});
                            break;
                        }
                    }
    
    
                }
            };
        }
    
        public static void main(String args[]) {
            new TestFrame();
        }
    
    }