2011-11-10 40 views
1

我正在嘗試使用JTree併爲所有父節點和子節點實現不同的下拉菜單。JTree和右鍵單擊節點上的下拉選項

這是我做了什麼:

pmTree.addMouseListener(new java.awt.event.MouseAdapter() { 
     @Override 
     public void mouseClicked(java.awt.event.MouseEvent evt) { 
      try { 
      if(evt.getButton() == evt.BUTTON1) { 
      } 
      else if (evt.getButton() == evt.BUTTON3) { 
       TreePopup(evt); 
       //pmTree.updateUI(); 
      } 
      }catch (Exception e) {} 
     } 
    }); 

和PopupCode:

public void TreePopup(java.awt.event.MouseEvent evt) { 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) pmTree.getLastSelectedPathComponent(); 
    popup = new JPopupMenu(); 
    popup.setInvoker(pmTree); 
    PopupHandler handler = new PopupHandler(pmTree, popup); 
    if(node.getLevel() == 1) 
    { 
     popup.add(getMenuItem("Parent Node", handler)); 
    } 
    else if(node.getLevel() == 2) 
    { 
     popup.add(getMenuItem("Child", handler)); 
    } 
    } 

和PopUpHandler:

public class PopupHandler extends javax.swing.JFrame implements ActionListener { 
JPopupMenu popup; 
Point loc; 

public PopupHandler(JTree tree, JPopupMenu popup) { 
    //this.tree = NewJFrame.pmTree; 
    this.popup = popup; 
    tree.addMouseListener(ma); 
} 

,也是

public void actionPerformed(java.awt.event.ActionEvent evt) 

爲被點擊的子節點或父節點。

但是,當我運行該程序時,我爲子節點和父節點獲取了相同的彈出式右鍵單擊。

對不起,大量的代碼。我一直堅持了2天,但沒有成功。 謝謝!

回答

2

您檢查選擇的節點:

DefaultMutableTreeNode node = (DefaultMutableTreeNode)pmTree.getLastSelectedPathComponent(); 

,看看是否有一個「父」或「子」節點。您應該首先在鼠標位置選擇節點,否則它不會是正確的節點。致電

TreePath path = pmTree.getPathForLocation(evt.getX(), evt.getY()); 
if (path != null) { 
    pmTree.setSelectionPath(path); 
} else { 
    return; 
} 

treePopup開頭。 (Java中的方法應以小寫字母開頭!)

+0

沒有 - 在表現良好的UI選擇無關彈出觸發 – kleopatra

+0

@kleopatra我不同意,單擊鼠標右鍵(彈出觸發)通常選擇。例如,看看Windows資源管理器。 –

+0

你是對的 - 只是檢查。這很奇怪,我記得Swing團隊的強烈辯論迫使他們不選擇右鍵單擊。所以那個時候(咳嗽......前一陣子)我猜勝利沒有選擇。感謝您的領導! – kleopatra

3

不要像MouseListener一樣使用低級別,而應使用componentPopupMenu周圍的api。這樣做的一般方法是動態配置getPopupLocation方法中的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) { 
       // here do your custom config, like f.i add/remove menu items based on context 
       // this example simply changes the action name 
       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); 
1

太棒了。我成功地將setSelectionPath()呼叫置於getPopupLocaiton()的覆蓋範圍內。我一直試圖在我的JMenuItemActionListener裏面做到這一點,但無濟於事。

public Point getPopupLocation(MouseEvent e) { 
    Point point = null; 
    if(e != null) { 
     TreePath path = getClosestPathForLocation(e.getX(), e.getY()); 
     setSelectionPath(path); 
     point = e.getPoint(); 
    } 
    return point; 
} 
相關問題