2013-06-05 70 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(); 
     } 

    } 
相关问题