2013-06-05 71 views
2

我有一個JTree,我可以(ctrl)選擇多個節點。 當我點擊右鍵時,我會彈出一個可以選擇'刷新'的彈出窗口。 (在這個網站上有其他問題可以解釋如何做到這一點)jtree右鍵單擊只選擇一個節點

問題是,當我選擇多個節點,我右鍵單擊,只有右擊節點被選中,其他人被取消選擇。

我想選擇3個節點(葉子),右鍵單擊,選擇'刷新',仍然有3個節點被選中。

有什麼建議嗎?謝謝!

例如:

import javax.swing.*; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.TreePath; 
import javax.swing.tree.TreeSelectionModel; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 

public class JTreeMultiSelect extends JFrame{ 

    public JTreeMultiSelect() { 
     super("Test"); 

     JTree myTree = new JTree(); 
     myTree.getSelectionModel() 
       .setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); 
     // add MouseListener to tree 
     MouseAdapter ma = new MouseAdapter() { 
      private void myPopupEvent(MouseEvent e) { 
       int x = e.getX(); 
       int y = e.getY(); 
       JTree tree = (JTree)e.getSource(); 
       TreePath path = tree.getPathForLocation(x, y); 
       if (path == null) 
        return; 

       tree.setSelectionPath(path); 

       DefaultMutableTreeNode rightClickedNode = 
         (DefaultMutableTreeNode)path.getLastPathComponent(); 

       if(rightClickedNode.isLeaf()){ 
        JPopupMenu popup = new JPopupMenu(); 
        final JMenuItem refreshMenuItem = new JMenuItem("refresh"); 
        refreshMenuItem.addActionListener(new ActionListener(){ 
         @Override 
         public void actionPerformed(ActionEvent actionEvent) { 
          System.out.println("refresh!"); 
         } 
        }); 
        popup.add(refreshMenuItem); 
        popup.show(tree, x, y); 
       } 
      } 
      public void mousePressed(MouseEvent e) { 
       if (e.isPopupTrigger()) myPopupEvent(e); 
      } 
      public void mouseReleased(MouseEvent e) { 
       if (e.isPopupTrigger()) myPopupEvent(e); 
      } 
     }; 

     myTree.addMouseListener(ma); 

     JPanel myPanel = new JPanel(); 
     myPanel.add(myTree); 
     this.add(myPanel); 
     this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     this.pack(); 
     this.setVisible(true); 

    } 

    public static void main(String[] args) { 
     new JTreeMultiSelect(); 
    } 

} 
+0

更快地發佈[SSCCE](http://sscce.org/),簡短,可運行,可編譯,僅關於JFrame和JTree,添加了TreeSelectionListener,其選擇模式,getSelectedXxx的代碼以及如何調用JPopupMenu可見 – mKorbel

+0

向我們顯示代碼!這聽起來像你正在改變選擇右鍵單擊,但不能說,除非我看到一些代碼。 – LiverpoolFTW

+0

我添加了代碼。它在tree.setSelectionPath(path); –

回答

2

下面一行

tree.setSelectionPath(path); 

你的樹選擇重置爲單個項目。您可能要刪除這條線,以獲得所需的行爲,甚至更好的把它放在一個狀態裏面來處理沒有選擇的情況下也:

if (tree.isSelectionEmpty()) { 
    tree.setSelectionPath(path); 
} 
+1

或者,如果您想要確保至少有一行被右鍵單擊,您可以讓該行僅在'tree.isSelectionEmpty()'返回true時執行。 – VGR

+0

@VGR好主意。將它添加到答案中。 – Howard

+0

您可能想要確定右鍵單擊的位置,查看該行是否被選中,如果是,請不要改變選擇。當右鍵單擊出現在所選行之外時,您可能需要首先選擇行 – Robin

2

這裏是如許在評論中工作示例:

import javax.swing.*; 
    import javax.swing.tree.DefaultMutableTreeNode; 
    import javax.swing.tree.TreePath; 
    import javax.swing.tree.TreeSelectionModel; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import java.awt.event.MouseAdapter; 
    import java.awt.event.MouseEvent; 

    public class JTreeMultiSelect extends JFrame{ 

     public JTreeMultiSelect() { 
      super("Test"); 

      JTree myTree = new JTree(); 
      myTree.getSelectionModel() 
        .setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); 
      // add MouseListener to tree 
      MouseAdapter ma = new MouseAdapter() { 
       private void myPopupEvent(MouseEvent e) { 
        int x = e.getX(); 
        int y = e.getY(); 
        JTree tree = (JTree)e.getSource(); 
        TreePath path = tree.getPathForLocation(x, y); 
        if (path == null) 
         return; 

        DefaultMutableTreeNode rightClickedNode = 
          (DefaultMutableTreeNode)path.getLastPathComponent(); 

        TreePath[] selectionPaths = tree.getSelectionPaths(); 

        //check if node was selected 
        boolean isSelected = false; 
        if (selectionPaths != null) { 
         for (TreePath selectionPath : selectionPaths) { 
          if (selectionPath.equals(path)) { 
           isSelected = true; 
          } 
         } 
        } 
        //if clicked node was not selected, select it 
        if(!isSelected){ 
         tree.setSelectionPath(path); 
        } 

        //todo : create custom JMenuItem that takes the selectionPaths as parameter 
        //  and do the action for each node (using getLastPathComponent) 
        if(rightClickedNode.isLeaf()){ 
         JPopupMenu popup = new JPopupMenu(); 
         final JMenuItem refreshMenuItem = new JMenuItem("refresh"); 
         refreshMenuItem.addActionListener(new ActionListener(){ 
          @Override 
          public void actionPerformed(ActionEvent actionEvent) { 
           System.out.println("refresh!"); 
          } 
         }); 
         popup.add(refreshMenuItem); 
         popup.show(tree, x, y); 
        } 
       } 
       public void mousePressed(MouseEvent e) { 
        if (e.isPopupTrigger()) myPopupEvent(e); 
       } 
       public void mouseReleased(MouseEvent e) { 
        if (e.isPopupTrigger()) myPopupEvent(e); 
       } 
      }; 

      myTree.addMouseListener(ma); 

      JPanel myPanel = new JPanel(); 
      myPanel.add(myTree); 
      this.add(myPanel); 
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      this.pack(); 
      this.setVisible(true); 

     } 

     public static void main(String[] args) { 
      new JTreeMultiSelect(); 
     } 

    } 
相關問題