Right-click context menu for Java JTree?

Posted by arcanex on Stack Overflow See other posts from Stack Overflow or by arcanex
Published on 2009-02-05T20:13:51Z Indexed on 2010/03/16 5:16 UTC
Read the original article Hit count: 757

Filed under:
|
|

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...

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?

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 < mouseListeners.length && mouseListeners[i] != ma; i++);
		if (i >= mouseListeners.length)
			c.addMouseListener(ma);

		return c;
	}

	protected boolean canEditImmediately(EventObject event) {
		if (event instanceof MouseEvent && ((MouseEvent)event).getClickCount() == 1)
			return true;
		else
			return false;
	}
}

© Stack Overflow or respective owner

Related posts about java

Related posts about jtree