2012-05-09 45 views
5

¡Estoy tratando de implementar un JTree para representar una base de datos! The Root es la base de datos, que puede tener varias relaciones. Cada relación puede tener atributos y dependencias funcionales. Cada nodo (base de datos, relación, atributo y fd) tiene un menú derecho diferente. El primer paso fue implementar el menú desplegable de la manera estándar (haga clic con el botón primario en un nodo y luego haga clic con el botón derecho para mostrar el menú emergente).JEl comportamiento del botón derecho como en cualquier Filebrowser

Ahora quiero cambiarlo al comportamiento estándar de los exploradores de archivos. Un clic derecho selecciona el nodo y muestra el popupmenu correcto.

Actualmente puedo hacer clic derecho y mostrar un menú emergente, pero el menú es incorrecto. Es el menú del nodo seleccionado anterior.

Aquí es un examplepicture del árbol:

enter image description here

Esto aquí es mi clase:

public class ShowPopupMouseListener extends MouseAdapter { 
    // Refernece: http://goo.gl/plojB 
    private JTree tree; 
    private JPopupMenu dbPopUpMenu; 
    private JPopupMenu relPopUpMenu; 
    private JPopupMenu attrPopUpMenu; 
    private JPopupMenu fdPopUpMenu; 
    private AttrPopupFactory attrPopupFactory; 

    public ShowPopupMouseListener(JTree jTree) { 
    this.tree = jTree; 
    DbPopupFactory dbPopupFactory = new DbPopupFactory(tree); 
    dbPopUpMenu = dbPopupFactory.getDbPopupMenu(); 

    RelPopupFactory relPopupFactory = new RelPopupFactory(tree); 
    relPopUpMenu = relPopupFactory.getRelPopupMenu(); 

    attrPopupFactory = new AttrPopupFactory(tree); 
    attrPopUpMenu = attrPopupFactory.getAttrPopupMenu(); 

    FdPopupFactory fdPopupFactory = new FdPopupFactory(tree); 
    fdPopUpMenu = fdPopupFactory.getFdPopupMenu(); 
    } 

    public void mousePressed(MouseEvent e) { 
    showMenuIfPopupTrigger(e); 
    } 

    public void mouseClicked(MouseEvent e) { 
    showMenuIfPopupTrigger(e); 
    } 

    public void mouseReleased(MouseEvent e) { 
    showMenuIfPopupTrigger(e); 
    } 

    private void showMenuIfPopupTrigger(final MouseEvent e) { 

    if (e.isPopupTrigger()) { 
     setSelectedItemsOnPopupTrigger(e); 

     if (tree.getLastSelectedPathComponent() instanceof DatabaseNode) { 
     addRightClickPopUpMenu(tree, dbPopUpMenu); 
     } else if (tree.getLastSelectedPathComponent() instanceof RelationNode) { 
     addRightClickPopUpMenu(tree, relPopUpMenu); 
     } else if (tree.getLastSelectedPathComponent() instanceof AttributeNode) { 
     attrPopupFactory.updateKeyCheckboxes(); 
     addRightClickPopUpMenu(tree, attrPopUpMenu); 
     } else if (tree.getLastSelectedPathComponent() instanceof FunctionalDependencyNode) { 
     addRightClickPopUpMenu(tree, fdPopUpMenu); 
     } 
    } 
    } 

    private void addRightClickPopUpMenu(Component component, 
     final JPopupMenu popUpMenu) { 
    component.addMouseListener(new MouseAdapter() { 
     public void mousePressed(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      showPopUpMenu(e); 
     } 
     } 

     public void mouseReleased(MouseEvent e) { 
     if (e.isPopupTrigger()) { 
      showPopUpMenu(e); 
     } 
     } 

     private void showPopUpMenu(MouseEvent e) { 
     popUpMenu.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    }); 
    } 

    private void setSelectedItemsOnPopupTrigger(MouseEvent e) { 
    TreePath p = tree.getPathForLocation(e.getX(), e.getY()); 
    if (!tree.getSelectionModel().isPathSelected(p)) { 
     tree.getSelectionModel().setSelectionPath(p); 
    } 
    } 

} 

Y en mi árbol que inicializarlo de la siguiente manera:

UIManager.put("PopupMenu.consumeEventOnClose", Boolean.FALSE); 
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); 
tree.addMouseListener(new ShowPopupMouseListener(tree)); 

¿Alguna sugerencia de por qué esto no está funcionando?

+1

Posible duplicado de [Menú contextual con el botón derecho del ratón para Java JTree?] (Http://stackoverflow.com/questions/517704/right-click-context-menu-for-java-jtree) – trashgod

Respuesta

9

Usted debe tratar de mantener las cosas simples, el siguiente es todo lo que realmente necesita:

Esto es lo mínimo que necesita para lograr la funcionalidad que está pidiendo, es obvio que puede añadir más funcionalidad personalizada según sea necesario.

Cuestiones relacionadas