2011-06-22 108 views
2

在GUI中,我在JPanel的左側顯示一個JTree。現在對於每個Node(leaf),在鼠標右鍵單擊上,我想要顯示JPopup菜單,要求在右邊的JPanel中顯示有關Node的統計信息。右鍵單擊Java中的Swing節點添加JPopup菜單

由於我是新的擺動,任何人都可以幫助代碼。 在此先感謝。

Regards, Tushar Dodia。

+0

我修改您的文章,請回復,如果不是... – mKorbel

回答

3

使用的JTree的方法

public TreePath getPathForLocation(int x, int y) 

隨後的TreePath

public Object getLastPathComponent() 

返回從點所需的節點,在用戶右鍵點擊。

+0

說的ISN有關如何爲JPopup添加的MouseListener到JTree的 – mKorbel

+1

的,我認爲,問題不在於「如何添加彈出」,而是「如何添加彈出取決於點擊節點「 – StanislavL

+0

好,很好的建議+1 – mKorbel

3

似乎已經引起了一些混亂(混淆自己;-) - 所以這裏做的componentPopup

JPopupMenu popup = new JPopupMenu(); 
    final Action action = new AbstractAction("empty") { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
     } 
    }; 
    popup.add(action); 
    JTree tree = new JTree() { 

     /** 
     * @inherited <p> 
     */ 
     @Override 
     public Point getPopupLocation(MouseEvent e) { 
      if (e != null) { 
       TreePath path = getClosestPathForLocation(e.getX(), e.getY()); 
       action.putValue(Action.NAME, String.valueOf(path.getLastPathComponent())); 
       return e.getPoint(); 
      } 
      action.putValue(Action.NAME, "no mouse"); 
      return null; 
     } 

    }; 
    tree.setComponentPopupMenu(popup); 
0

我把@kleopatra解決方案,改變了它稍微的目標位置相關的配置代碼段。 也許這不是最好的方式,但爲我工作。

JTree tree = new JTree() { 
    private static final long serialVersionUID = 1L; 
    @Override public Point getPopupLocation(MouseEvent e) { 
     if (e == null) return new Point(0,0); 
     TreePath path = getClosestPathForLocation(e.getX(), e.getY()); 
     Object selected = path != null ? path.getLastPathComponent() : null; 
     setComponentPopupMenu(getMenuForTreeNode(getComponentPopupMenu(), selected)); 
     setSelectionPath(path); 
     return e.getPoint(); 
    } 
}; 



public JPopupMenu getMenuForTreeNode(JPopupMenu menu, Object treeNode) { 
    if (menu == null) menu = new JPopupMenu("Menu:"); 
    menu.removeAll(); 
    if (treeNode instanceof MyTreeItem) { 
     menu.add(new JMenuItem("This is my tree item: " + treeNode.toString())); 
    } 
    return menu; 
} 
+0

改變componentPopup實例(不確定是否這樣做,只是說:-)會有點脆弱:它取決於getPopupLocation的調用代碼來調用getComponentPopup _after_請求位置。 Oracle的BasicLookAndFeel中偶然會出現這種情況,其他實現可能不會 – kleopatra

相關問題