Share this page 

Have a popup attached to a JTreeTag(s): Swing


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JComponent;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
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 MyJTree extends JTree implements ActionListener{
  JPopupMenu popup;
  JMenuItem mi;

  MyJTree (DefaultMutableTreeNode dmtn) {
   super(dmtn);
   // define the popup
   popup = new JPopupMenu();
   mi = new JMenuItem("Insert a children");
   mi.addActionListener(this);
   mi.setActionCommand("insert");
   popup.add(mi);
   mi = new JMenuItem("Remove this node");
   mi.addActionListener(this);
   mi.setActionCommand("remove");
   popup.add(mi);  
   popup.setOpaque(true);
   popup.setLightWeightPopupEnabled(true);

   final JTree thisTree = this;
   addMouseListener (
       new MouseAdapter () {
          public void mouseReleased( MouseEvent e ) {
            // thanks to urbanq for the bug fix!
            int row = thisTree.getRowForLocation(e.getX(), e.getY());
            if(row == -1)
              return;              
            thisTree.setSelectionRow(row);
             if ( e.isPopupTrigger()) {
                 popup.show( (JComponent)e.getSource(), 
                                e.getX(), e.getY() );
                 }
             } 
          }
       );
    
  }
 public void actionPerformed(ActionEvent ae) {
   DefaultMutableTreeNode dmtn, node;

   TreePath path = this.getSelectionPath();
   dmtn = (DefaultMutableTreeNode) path.getLastPathComponent();
   if (ae.getActionCommand().equals("insert")) {
     node = new DefaultMutableTreeNode("children");
     dmtn.add(node);
     // thanks to Yong Zhang for the tip for refreshing the tree struct
     ((DefaultTreeModel )this.getModel())
          .nodeStructureChanged((TreeNode)dmtn); 
     }
   if (ae.getActionCommand().equals("remove")) {
     node = (DefaultMutableTreeNode)dmtn.getParent();
     node.removeAllChildren();
     ((DefaultTreeModel )this.getModel())
          .nodeStructureChanged((TreeNode)dmtn); 
     }
   }
}

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.*;
import javax.swing.tree.*;

public class TreeWithPopup extends JPanel{ 
    DefaultMutableTreeNode root, node1, node2, node3;
    public TreeWithPopup() {
      MyJTree tree;
      root = new DefaultMutableTreeNode("root", true);
      node1 = new DefaultMutableTreeNode("node 1", true);
      node2 = new DefaultMutableTreeNode("node 2" , true);
      node3 = new DefaultMutableTreeNode("node 3", true);
      root.add(node1);
      node1.add(node2);
      root.add(node3);
      setLayout(new BorderLayout());
      tree = new MyJTree(root);
      add(new JScrollPane((JTree)tree),"Center");
    }

    public Dimension getPreferredSize(){
      return new Dimension(300, 300);
    }
     
    public static void main(String s[]){
      JFrame frame = new JFrame("Tree With Popup");
      TreeWithPopup panel = new TreeWithPopup();
      frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
      frame.setForeground(Color.black);
      frame.setBackground(Color.lightGray);
      frame.getContentPane().add(panel,"Center");
      frame.setSize(panel.getPreferredSize());
      frame.setVisible(true);
      frame.addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
          Window win = e.getWindow();
          win.setVisible(false);
          System.exit(0);
          }
      });
    }
 }