ddk
ddk

Reputation: 179

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);

Upvotes: 0

Views: 9205

Answers (2)

alex2410
alex2410

Reputation: 10994

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();
    }

}

Upvotes: 1

Sergiy Medvynskyy
Sergiy Medvynskyy

Reputation: 11327

I'm not sure because you haven't posted a full runnable example, but I think, you simply need to update your model.

bird.add(sparrow);
bird.add(cuckoo);
model.reload(); // your model and tree don't know that you've added some nodes.
this.pack();
this.setVisible(true);

Upvotes: -1

Related Questions