2012-05-09 10 views
5

Bir veritabanını temsil etmek için bir JTree uygulamaya çalışıyorum! Kök, çeşitli ilişkilere sahip olabilen veritabanıdır. Her ilişki özniteliklere ve işlevsel bağımlılıklara sahip olabilir. Her düğümün (veritabanı, ilişki, öznitelik ve fd) farklı bir sağ tıklatma menüsü vardır. İlk adım, açılan menü standart yolla (bir düğüme ilk leftclick, daha sonra popupmenu göstermek için rightclick) uygulamak oldu.Herhangi bir Filebrowser gibi JTree rightclick davranışı

Şimdi bunu dosya kaşiflerinin standart davranışına değiştirmek istiyorum. Bir rightclick düğümü seçer ve doğru popupmenu'yu gösterir.

Şu anda bir popupmenu öğesini tıklatıp gösterebiliyorum ama menü yanlış. Seçilen önceki düğümün menüsü.

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

} 

Ve ağacında

bunu başlatmak aşağıdaki yolu: Bu benim sınıftır

enter image description here

:

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

bir ağacın Examplepicture olduğunu

Bunun neden çalışmadığı konusunda herhangi bir öneriniz var mı?

+1

Olası kopya [Java JTree için sağ tıklama bağlam menüsü] (http://stackoverflow.com/questions/517704/right-click-context-menu-for-java-jtree) – trashgod

cevap

9
Sen her şeyi basit tutmayı denemelisiniz

aşağıdaki hepsi gerçekten ihtiyacınız:

Bu sizin için soruyorsun işlevselliği elde etmek için ihtiyaç yürütmem, belli ki daha özel işlevler ekleyebilirsiniz ihyaç olduğu gibi.

İlgili konular