title: Right-click context menu for Java JTree?
body: <p>I'm trying to implement pop-up menus in Java JTree. I've sub-classed DefaultTreeCellRenderer (to change node appearance) and DefaultTreeCellEditor (to create Components to attach event listeners to, since apparently the Components that DefaultTreeCellRenderer.getTreeCellRendererComponent() returns can't do it?). I don't really want to "edit" the nodes, just be able to pop-up a menu when a node gets right-clicked, but this is the only way I can think of doing it right now...</p>
  
  <p>Below is the code that I have so far-- I'm just trying to figure out how to capture MouseEvents. It sort of works, but badly. What's a better way to accomplish what I'm trying to do here?</p>
  
  <pre><code>private class My_TreeCellRenderer extends DefaultTreeCellRenderer { 
      My_TreeCellRenderer() {
          super ();
      }   
  
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) {
          super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);
  
          // set label text and tool tips
          setText(((My_Object)value).getTreeLabel());
          setToolTipText(((My_Object)value).getTreeToolTip());
  
          return this;
      }
  }
  
  private class My_TreeCellEditor extends DefaultTreeCellEditor { 
      private MouseAdapter ma;
  
      My_TreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
          super (tree, renderer);
          ma = new MouseAdapter() {
              public void mousePressed(MouseEvent e) {
                  if (e.isPopupTrigger()) {
                      System.out.println("My Popup");
                  }
              }
              public void mouseReleased(MouseEvent e) {
                  if (e.isPopupTrigger()) {
                      System.out.println("My Popup");
                  }
              }
          };
      }
  
      public Component getTreeCellEditorComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row) {
          String src_filename = null;
  
          // return non-editing component
          Component c = renderer.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, true);
  
          // add mouse listener if it's not listening already
          MouseListener mouseListeners[] = c.getMouseListeners();
          int i;
          for (i=0; i &lt; mouseListeners.length &amp;&amp; mouseListeners[i] != ma; i++);
          if (i &gt;= mouseListeners.length)
              c.addMouseListener(ma);
  
          return c;
      }
  
      protected boolean canEditImmediately(EventObject event) {
          if (event instanceof MouseEvent &amp;&amp; ((MouseEvent)event).getClickCount() == 1)
              return true;
          else
              return false;
      }
  }
  </code></pre>