You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:06:05