Java tutorial
import java.awt.BorderLayout; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeNode; import javax.swing.tree.TreePath; public class Main extends JFrame { public Main() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); TreeNode root = getNodes(); DefaultTreeModel model = new DefaultTreeModel(root); JTree tree = new JTree(model); tree.setRootVisible(false); JButton add = new JButton("add new"); add.addActionListener(e -> { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode == null) { return; } MyObject obj = (MyObject) selectedNode.getUserObject(); MyObject newChild = new MyObject(obj.name + "-" + (obj.childs.size() + 1)); obj.childs.add(newChild); DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(newChild); model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount()); TreeNode[] nodes = model.getPathToRoot(newNode); TreePath path = new TreePath(nodes); tree.scrollPathToVisible(path); }); JButton print = new JButton("print childs"); print.addActionListener(e -> { DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); if (selectedNode == null) { return; } MyObject obj = (MyObject) selectedNode.getUserObject(); System.out.println(obj.childs); }); JPanel btns = new JPanel(); btns.add(add); btns.add(print); add(new JScrollPane(tree)); add(btns, BorderLayout.SOUTH); pack(); setVisible(true); } private TreeNode getNodes() { MyObject obj1 = new MyObject("1"); MyObject obj2 = new MyObject("1-1"); obj1.childs.add(obj2); obj2.childs.add(new MyObject("2-1")); obj2.childs.add(new MyObject("2-2")); obj1.childs.add(new MyObject("1-2")); obj1.childs.add(new MyObject("1-3")); DefaultMutableTreeNode root = new DefaultMutableTreeNode(); construct(obj1, root); return root; } private void construct(MyObject obj1, DefaultMutableTreeNode root) { DefaultMutableTreeNode node = new DefaultMutableTreeNode(obj1); root.add(node); for (MyObject o : obj1.childs) { construct(o, node); } } public static void main(String... strings) { new Main(); } } class MyObject { public String name; public List<MyObject> childs = new ArrayList<>(); public MyObject(String name) { this.name = name; } @Override public String toString() { return name; } }