如何获取JTree中包含对应子行的所有选中行
解决方案
核心实现逻辑是在原有获取选中行的逻辑基础上,额外递归收集选中节点所有子节点对应的行号,去重排序后生成新的选中行数组即可,不需要修改现有拖拽的其他逻辑:
- 先从原始选中行获取对应树路径,递归遍历每个路径下的所有子节点,收集所有节点对应的行号
- 用集合自动去重排序后,转换为整型数组替换原有选中行数组即可
你可以直接使用如下封装好的工具方法:
private int[] getSelectionRowsIncludingChildren(JTree tree) { int[] originalSelectedRows = tree.getSelectionRows(); if (originalSelectedRows == null || originalSelectedRows.length == 0) { return originalSelectedRows; } // TreeSet自动实现行号去重+升序排序 Set<Integer> allRowSet = new TreeSet<>(); for (int row : originalSelectedRows) { TreePath path = tree.getPathForRow(row); addPathAndChildrenToRowSet(tree, path, allRowSet); } // 转换为int数组返回 int[] result = new int[allRowSet.size()]; int index = 0; for (Integer rowNum : allRowSet) { result[index++] = rowNum; } return result; } private void addPathAndChildrenToRowSet(JTree tree, TreePath parentPath, Set<Integer> rowSet) { // 添加当前节点的行号 int currentRow = tree.getRowForPath(parentPath); if (currentRow != -1) { rowSet.add(currentRow); } Object parentNode = parentPath.getLastPathComponent(); // 适配默认DefaultMutableTreeNode实现,自定义节点可修改此处判断逻辑 if (parentNode instanceof DefaultMutableTreeNode) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) parentNode; Enumeration<?> children = node.children(); while (children.hasMoreElements()) { Object child = children.nextElement(); TreePath childPath = parentPath.pathByAddingChild(child); // 递归处理子节点 addPathAndChildrenToRowSet(tree, childPath, rowSet); } } }
你原来调用tree.getSelectionRows()的位置,直接替换为调用getSelectionRowsIncludingChildren(tree)即可,效果和手动按CTRL + Click全选所有子节点完全一致。
内容的提问来源于stack exchange,提问作者yur
相关产品推荐
相关产品推荐

