Java JTree handle tree model changed event

Description

Java JTree handle tree model changed event

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreePath;

class DynamicTree extends JPanel {
   DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Root Node");
   DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
   JTree tree = new JTree(treeModel);

   public DynamicTree() {
      super(new GridLayout(1, 0));
      /*from   w w w. java  2 s.  co m*/
      treeModel.addTreeModelListener(new MyTreeModelListener());
      
      tree.setEditable(true);
      tree.setShowsRootHandles(true);

      JScrollPane scrollPane = new JScrollPane(tree);
      add(scrollPane);
   }

   public void clear() {
      rootNode.removeAllChildren();
      treeModel.reload();
   }

   public void removeCurrentNode() {
      TreePath currentSelection = tree.getSelectionPath();
      if (currentSelection != null) {
         DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode) (currentSelection.getLastPathComponent());
         MutableTreeNode parent = (MutableTreeNode) (currentNode.getParent());
         if (parent != null) {
            treeModel.removeNodeFromParent(currentNode);
            return;
         }
      }
   }

   public DefaultMutableTreeNode addObject(Object child) {
      DefaultMutableTreeNode parentNode = null;
      TreePath parentPath = tree.getSelectionPath();

      if (parentPath == null) {
         parentNode = rootNode;
      } else {
         parentNode = (DefaultMutableTreeNode) (parentPath.getLastPathComponent());
      }

      return addObject(parentNode, child, true);
   }

   public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent, Object child) {
      return addObject(parent, child, false);
   }

   public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent, Object child, boolean shouldBeVisible) {
      DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child);

      if (parent == null) {
         parent = rootNode;
      }
      treeModel.insertNodeInto(childNode, parent, parent.getChildCount());

      if (shouldBeVisible) {
         tree.scrollPathToVisible(new TreePath(childNode.getPath()));
      }
      return childNode;
   }

}
class MyTreeModelListener implements TreeModelListener {
   public void treeNodesChanged(TreeModelEvent e) {
      DefaultMutableTreeNode node;
      node = (DefaultMutableTreeNode) (e.getTreePath().getLastPathComponent());

      int index = e.getChildIndices()[0];
      node = (DefaultMutableTreeNode) (node.getChildAt(index));

      System.out.println("The user has finished editing the node.");
      System.out.println("New value: " + node.getUserObject());
   }

   public void treeNodesInserted(TreeModelEvent e) {
      System.out.println(e);
   }

   public void treeNodesRemoved(TreeModelEvent e) {
      System.out.println(e);
   }

   public void treeStructureChanged(TreeModelEvent e) {
      System.out.println(e);
   }
}

public class Main extends JPanel implements ActionListener {
   private int newNodeSuffix = 1;
   private static String ADD_COMMAND = "add";
   private static String REMOVE_COMMAND = "remove";
   private static String CLEAR_COMMAND = "clear";

   private DynamicTree treePanel;

   public Main() {
      super(new BorderLayout());
      treePanel = new DynamicTree();
      populateTree(treePanel);

      JButton addButton = new JButton("Add");
      addButton.setActionCommand(ADD_COMMAND);
      addButton.addActionListener(this);

      JButton removeButton = new JButton("Remove");
      removeButton.setActionCommand(REMOVE_COMMAND);
      removeButton.addActionListener(this);

      JButton clearButton = new JButton("Clear");
      clearButton.setActionCommand(CLEAR_COMMAND);
      clearButton.addActionListener(this);

      // Lay everything out.
      treePanel.setPreferredSize(new Dimension(300, 150));
      add(treePanel, BorderLayout.CENTER);

      JPanel panel = new JPanel(new GridLayout(0, 3));
      panel.add(addButton);
      panel.add(removeButton);
      panel.add(clearButton);
      add(panel, BorderLayout.SOUTH);
   }

   public void populateTree(DynamicTree treePanel) {
      DefaultMutableTreeNode p1 = treePanel.addObject(null, "1");
      DefaultMutableTreeNode p2 = treePanel.addObject(null, "2");

      treePanel.addObject(p1, "C1");
      treePanel.addObject(p1, "C2");

      treePanel.addObject(p2, "C3");
      treePanel.addObject(p2, "C4");
   }

   public void actionPerformed(ActionEvent e) {
      String command = e.getActionCommand();
      if (ADD_COMMAND.equals(command)) {
         treePanel.addObject("New Node " + newNodeSuffix++);
      } else if (REMOVE_COMMAND.equals(command)) {
         treePanel.removeCurrentNode();
      } else if (CLEAR_COMMAND.equals(command)) {
         treePanel.clear();
      }
   }

   public static void main(String[] args) {
      JFrame frame = new JFrame("DynamicTreeDemo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      Main newContentPane = new Main();
      frame.setContentPane(newContentPane);
      frame.pack();
      frame.setVisible(true);
   }
}



PreviousNext

Related