2013-06-05 4 views
2

У меня есть JTree, и я могу (ctrl) выбрать несколько узлов. Когда я нажимаю правой кнопкой мыши, я получаю всплывающее окно, где я могу выбрать «обновить». (есть другие вопросы на этом сайте, которые объясняют, как это сделать)jtree right click выбирает только один узел

Проблема заключается в том, что при выборе нескольких узлов, и я нажимаю правой кнопкой мыши, выбирается только тот, который я щелкнул правой кнопкой мыши, а остальные не выбраны.

Я хочу выбрать, например, 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, его режимом выбора, кодом, где вы получаетеSelectedXxx и как вызывать JPopupMenu будет видимым – mKorbel

+0

Показать код! Похоже, вы меняете выделение по правому клику, но не можете сказать, если я не вижу код. – LiverpoolFTW

+0

Я добавил код. Он находится в tree.setSelectionPath (путь); –

ответ

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

    } 

 Смежные вопросы

  • Нет связанных вопросов^_^