Estoy tratando de implementar menús emergentes en Java JTree. He subclasificado DefaultTreeCellRenderer (para cambiar la apariencia del nodo) y DefaultTreeCellEditor (para crear Componentes para adjuntar detectores de eventos, ya que aparentemente los Componentes que DefaultTreeCellRenderer.getTreeCellRendererComponent() devuelven no pueden hacerlo). Realmente no quiero "editar" los nodos, solo ser capaz de abrir un menú cuando se hace clic derecho en un nodo, pero esta es la única forma en que se me ocurre hacerlo ahora ...Haga clic derecho en el menú contextual para Java JTree?
A continuación se muestra el código que tengo hasta ahora, solo estoy tratando de averiguar cómo capturar MouseEvents. De alguna manera funciona, pero mal. ¿Cuál es una mejor manera de lograr lo que estoy tratando de hacer aquí?
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;
}
}
Está creando un JPopupMenu todo el tiempo. Mueva la creación a otro lugar donde solo se haga una vez para modificarla en el evento –
Este es un buen ejemplo de optimización prematura (http://en.wikiquote.org/wiki/Donald_Knuth). No tiene sentido crear un objeto de larga vida hasta que haya una razón para hacerlo (inicialización lenta de recursos, por ejemplo). –