2012-05-09 18 views
5

Tôi đang cố triển khai JTree để đại diện cho một cơ sở dữ liệu! Gốc là cơ sở dữ liệu, có thể có nhiều mối quan hệ. Mỗi mối quan hệ có thể có các thuộc tính và các phụ thuộc chức năng. Mỗi nút (cơ sở dữ liệu, quan hệ, thuộc tính và fd) có một menu chuột phải khác nhau. Bước đầu tiên là triển khai menu thả xuống theo cách chuẩn (đầu tiên nhấp chuột trái vào nút, sau đó nhấp chuột phải để hiển thị popupmenu).Hành vi đúng đắn của JTree giống như trong bất kỳ Filebrowser nào

Bây giờ tôi muốn thay đổi nó thành hành vi tiêu chuẩn của người khám phá tệp. Một nhấp chuột phải chọn nút và hiển thị popupmenu chính xác.

Hiện tại tôi có thể nhấp chuột phải và hiển thị cửa sổ bật lên, nhưng menu không chính xác. Đây là menu của nút đã chọn trước đó.

Dưới đây là một examplepicture của cây:

enter image description here

này ở đây là lớp học của tôi:

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

} 

Và trong cây của tôi, tôi khởi tạo nó theo cách sau:

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

Bất kỳ đề xuất nào tại sao tính năng này không hoạt động?

+1

Bản sao có thể có của [Trình đơn ngữ cảnh nhấp chuột phải cho Java JTree?] (Http://stackoverflow.com/questions/517704/right-click-context-menu-for-java-jtree) – trashgod

Trả lời

9

Bạn nên cố gắng giữ mọi thứ đơn giản, sau đây là tất cả các bạn thực sự cần:

Đây là mức tối thiểu bạn cần để đạt được các chức năng bạn đang yêu cầu, bạn rõ ràng có thể thêm chức năng tùy chỉnh hơn khi cần thiết.