2012-05-09 8 views
5

Sto cercando di implementare un JTree per rappresentare un database! Il root è il database, che può avere diverse relazioni. Ogni relazione può avere attributi e dipendenze funzionali. Ogni nodo (database, relazione, attributo e fd) ha un diverso menu di scelta rapida. Il primo passo è stato quello di implementare il menu a comparsa nel modo standard (prima fare clic con il tasto sinistro del mouse su un nodo, quindi fare clic con il pulsante destro del mouse per visualizzare il menu popup).JTree comportamento di rightclick come in qualsiasi Filebrowser

Ora voglio cambiarlo al comportamento standard di esploratori di file. Un clic destro seleziona il nodo e mostra il menu popup corretto.

Attualmente sono in grado di fare clic con il pulsante destro del mouse e mostrare un menu popup, ma il menu non è corretto. È il menu del nodo selezionato precedente.

Ecco un examplepicture dell'albero:

enter image description here

Questa è la mia classe:

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); 
    } 
    } 

} 

E nel mio albero ho inizializzare seguente modo:

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

Qualche suggerimento sul perché questo non funziona?

+1

Possibile duplicato di [Menu di scelta rapida per Java JTree?] (Http://stackoverflow.com/questions/517704/right-click-context-menu-for-java-jtree) – trashgod

risposta

9

Si dovrebbe provare a tenere le cose semplici, il seguente è tutto quello che ha realmente bisogno:

Questo è il minimo necessario per ottenere la funzionalità che stai chiedendo, ovviamente è possibile aggiungere ulteriori funzionalità personalizzate come necessario.

Problemi correlati