JDialog - Refresh dynamically added nodes in JTree

java, jdialog, jtree, swing, treemodel

Solution

Make sure to expand the path from the parent of the new node to the root each time you add a new child node:

DefaultMutableTreeNode newChild = new DefaultMutableTreeNode("Node " + (root.getChildCount() + 1));
dm.insertNodeInto(newChild, root, root.getChildCount());
tree.expandPath(new TreePath(dm.getPathToRoot(newChild.getParent())));

Problem

I have a problem with JTree nodes visibility I use for my JDialog. When I want to add new node to the model the Jtree is not refreshed. Strange is the nodes are updating just as they should if I set setRootVisible(true). Here is the code. Thanks in advance ``` import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; public class TestClass { JTree tree; DefaultTreeModel dm; JDialog dialog; public TestClass(){ JFrame frame = new JFrame("title"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); JPanel showPane = new JPanel(); showPane.setLayout(new BorderLayout()); dm = new DefaultTreeModel(new DefaultMutableTreeNode("root")); tree = new JTree(dm); tree.setRootVisible(false); JButton button = new JButton("add node"); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { DefaultMutableTreeNode root = (DefaultMutableTreeNode) tree.getModel().getRoot(); dm.insertNodeInto(new DefaultMutableTreeNode("Node " + (root.getChildCount() + 1)), root, root.getChildCount()); int c = root.getChildCount(); System.out.println("child count: " + c); for(int i=0; i<c; i++){ DefaultMutableTreeNode node = (DefaultMutableTreeNode) root.getChildAt(i); System.out.println("has node:" + node.getUserObject().toString()); } } }); showPane.add(tree, BorderLayout.CENTER); showPane.add(button, BorderLayout.PAGE_END); JComponent[] inputComponents = new JComponent[] {showPane}; Object[] opButtons = {"OK"}; JOptionPane optPane = new JOptionPane(inputComponents , JOptionPane.PLAIN_MESSAGE , JOptionPane.CLOSED_OPTION , null , opButtons , opButtons[0]); optPane.setPreferredSize(new Dimension(400 ,250)); dialog = optPane.createDialog(null, "Create new Application Node"); dialog.setLocationRelativeTo(frame); dialog.setVisible(true); if(optPane.getValue() != null){ System.exit(0); } } public static void main(String arg[]){ TestClass myClass = new TestClass(); } ``` }

Original source