Я хотел бы добавить к ответу Клеопатры (основываясь на моих собственных болях роста).
В моей конкретной проблеме мне нужно было добавить пункт меню «Выбрать всех детей» во всплывающее меню узла 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);
}
}