2012-05-09 3 views
5

데이터베이스를 나타 내기 위해 JTree를 구현하려고합니다! 루트는 여러 관계를 가질 수있는 데이터베이스입니다. 각 릴레이션은 속성과 함수 종속성을 가질 수 있습니다. 각 노드 (데이터베이스, 관계, 속성 및 fd)에는 다른 오른쪽 클릭 메뉴가 있습니다. 첫 번째 단계는 표준 방식으로 팝업 메뉴를 구현하는 것입니다 (첫 번째는 노드에서 왼쪽 클릭 한 다음 팝업 메뉴를 표시하려면 오른쪽 클릭).FileBrowser와 같은 JTree rightclick 동작

이제 파일 탐색기의 표준 동작으로 변경하고 싶습니다. 오른쪽 클릭은 노드를 선택하고 올바른 팝업 메뉴를 표시합니다.

현재 팝업 메뉴를 오른쪽 클릭하고 표시 할 수 있지만 메뉴가 잘못되었습니다. 이전에 선택된 노드의 메뉴입니다.

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

} 

그리고 내 나무에

내가 그것을 초기화 다음과 같은 방법 :이 여기 내 클래스입니다

enter image description here

:

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

는 나무의 examplepicture입니다

이것이 작동하지 않는 이유는 무엇입니까?

+1

가능한 [Java JTree의 마우스 오른쪽 버튼 메뉴] (http://stackoverflow.com/questions/517704/right-click-context-menu-for-java-jtree) – trashgod

답변

9
당신은 단순하게 유지하려고한다

는 다음과 같은 모든입니다 당신이 정말로 필요

class RightMouseListener implements MouseListener { 

    @Override 
    public void mouseClicked(MouseEvent e) { 

     if (SwingUtilities.isRightMouseButton(e)) { 

      int row = tree.getClosestRowForLocation(e.getX(), e.getY()); 
      tree.setSelectionRow(row); 
      popupMenu.show(e.getComponent(), e.getX(), e.getY()); 
     } 
    } 

    ... 

    //other overrides 

    ... 
}; 

이 당신이 요구하고있는 기능을 달성하는 데 필요한 최소한입니다, 당신은 분명 이상의 사용자 정의 기능을 추가 할 수 있습니다 필요에 따라.