JTree: Выбор всех узлов программно - PullRequest
5 голосов
/ 07 сентября 2011

У меня есть Jtree и 2 кнопки для выбора и отмены выбора всех узлов.Я предпринял попытку, подобную этой:

selectAll = new JButton("Select all");
selectAll.addActionListener(new ActionListener (){
        @Override
        public void actionPerformed(ActionEvent e) {
                int row = 0;
                while (row < curvesTree.getRowCount())
                {
                    curvesTree.expandRow(row);
                    row++;
                }
            int entradasTree = curvesTree.getRowCount();
            for(int i=0; i<entradasTree; i++){
                TreePath path = curvesTree.getPathForRow(i);
                curvesTree.setSelectionPath(path);
            }
        }
    });

        unselectAll = new JButton("Unselect all");
        unselectAll.addActionListener(new ActionListener (){
            @Override
            public void actionPerformed(ActionEvent e) {
                curvesTree.clearSelection();
            }
        });

Кажется, кнопка отмены выбора работает, но выбор всего лишь расширяет JTree и выбирает последний узел.Я думаю, что каждый раз, когда узел выбирается программно, я не выбираю прежний.

JTree настроен так:

curvesTree = new JTree(rootNode);
curvesTree.setExpandsSelectedPaths(true);
curvesTree.getSelectionModel().setSelectionMode(TreeSelectionModel.
                  DISCONTIGUOUS_TREE_SELECTION);

Ответы [ 3 ]

6 голосов
/ 07 сентября 2011

отмена выбора происходит потому, что вы устанавливаете новый путь выбора вместо добавления.В цикле после расширения вместо этого выполните

 curvesTree.addSelectionPath(...)

EDIT

чтение API всегда поучительно, даже спустя годы ;-) Просто нашел гораздо более простой метод, которыйоставляет всю работу за деревом:

tree.setSelectionInterval(0, tree.getRowCount());
0 голосов
/ 07 сентября 2016

Я хотел бы добавить к ответу Клеопатры (основываясь на моих собственных болях роста).

В моей конкретной проблеме мне нужно было добавить пункт меню «Выбрать всех детей» во всплывающее меню узла JTree. Поэтому это решение применяется ко всем дочерним узлам выбранного узла.

TreeNode selectedNode = tree.getSelectionPath().getLastPathComponent();
// Expand tree from selected node...
List<TreePath> paths = new ArrayList<TreePath>();
determineTreePaths(selectedNode, paths); // Recursive method call...

TreePath[] treePaths = new TreePath[paths.size()];
Iterator<TreePath> iter = paths.iterator();

for (int i = 0; iter.hasNext(); ++i)
{
   treePaths[i] = iter.next();
}

if (paths.size() > 0)
{
   TreePath firstElement = paths.get(0);
   setSelectionPath(firstElement);
   scrollPathToVisible(firstElement);
}    

Рекурсивный вызов determineTreePaths(selectedNode, paths) необходим для прохождения дерева от выбранного узла до конечных узлов. Это решение работает независимо от глубины (насколько мне известно). Я не могу сказать, что это самое эффективное решение. Любой, у кого есть лучшее решение, можете опубликовать другое решение или отредактировать его.

Реализация метода выглядит следующим образом:

private void determineTreePaths(TreeNode currentNode, List<TreePath> paths)
{
   paths.add(new TreePath(((DefaultTreeModel) getDefaultTreeModel()).getPathToRoot(currentNode));

   // Get all of my Children
   Enumeration<?> children = currentNode.children();

   // iterate over my children
   while (children.hasMoreElements())
   {
      TreeNode child = (TreeNode) children.nextElement();
      determineTreePaths(child, paths);
   }
}
0 голосов
/ 07 сентября 2011

да возможно ли это, например:

import java.awt.Dimension;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;

public class TreeWithMultiDiscontiguousSelections {

    public static void main(String[] argv) {
        JTree tree = new JTree();
        tree.getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);
        int treeSelectedRows[] = {3, 1};
        tree.setSelectionRows(treeSelectedRows);
        TreeSelectionListener treeSelectionListener = new TreeSelectionListener() {

            @Override
            public void valueChanged(TreeSelectionEvent treeSelectionEvent) {
                JTree treeSource = (JTree) treeSelectionEvent.getSource();
                System.out.println("Min: " + treeSource.getMinSelectionRow());
                System.out.println("Max: " + treeSource.getMaxSelectionRow());
                System.out.println("Lead: " + treeSource.getLeadSelectionRow());
                System.out.println("Row: " + treeSource.getSelectionRows()[0]);
            }
        };
        tree.addTreeSelectionListener(treeSelectionListener);
        JFrame frame = new JFrame("JTree With Multi-Discontiguous selection");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(tree));
        frame.setPreferredSize(new Dimension(380, 320));
        frame.setLocation(150, 150);
        frame.pack();
        frame.setVisible(true);
    }

    private TreeWithMultiDiscontiguousSelections() {
    }
}
...