JTree rightclick行为就像在任何Filebrowser

问题描述:

我想实现一个JTree来表示一个数据库! 根是数据库,它可以有几个关系。每个关系都可以具有属性和功能依赖关系。 每个节点(数据库,关系,属性和fd)都有不同的右键单击菜单。 第一步是以标准方式实现弹出式菜单(首先左键单击节点,然后右键单击以显示弹出菜单)。JTree rightclick行为就像在任何Filebrowser

现在我想将其更改为文件浏览器的标准行为。右击选择节点并显示正确的弹出菜单。

目前我可以右键单击并显示弹出菜单,但菜单不正确。它是上一个选定节点的菜单。

这里是树的examplepicture:

enter image description here

在这里,这是我的课:

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

} 

而且在我的树我初始化方式如下:

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

任何建议为什么这不起作用?

+1

[Java JTree的右键单击上下文菜单是否可能重复?](http://stackoverflow.com/questions/517704/right-click-context-menu-for-java-jtree) – trashgod

你应该尽量保持简单的事情,以下是你真正需要的:

这是你需要达到你要求的功能,最起码,你可以明显地增加更多的自定义功能如所须。