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

获取JTree所有叶子节点异常求助:仅显示22个类而非30个

问题排查与修复方案

我来帮你捋捋这个问题,你的代码逻辑明显走偏了,这才导致只显示了22个类,没把30个全输出出来。

先说说你原来代码的问题

你用root.getLeafCount()拿到了整个树的叶子总数(也就是30个类),然后把这个数当成外层循环的上限去遍历j,接着每个包节点去取第j个子节点——这完全不符合树的结构逻辑啊!

每个包下面的类数量肯定不一样吧?比如第一个包有12个类,第二个有18个,那当j走到12的时候,第一个包的getChildAt(12)就会抛出数组越界异常(如果没显式捕获,事件线程可能悄悄吞掉这个异常,直接终止循环),这样就只能输出前12+10=22个节点,剩下的8个根本没机会打印。

而且你把循环顺序搞反了:应该先遍历每个包,再遍历包下面的所有类,而不是反过来。

修复后的代码(针对两级结构:根->包->类)

如果你的树结构就是根节点下面直接是包,包下面直接是类,用这段代码就可以正确遍历所有类:

btnG.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        TreeModel model = tree.getModel();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
        
        // 先遍历每个包节点(根的直接子节点)
        for (int i = 0; i < root.getChildCount(); i++) {
            DefaultMutableTreeNode packageNode = (DefaultMutableTreeNode) root.getChildAt(i);
            // 再遍历当前包下的所有子节点(也就是类)
            for (int j = 0; j < packageNode.getChildCount(); j++) {
                DefaultMutableTreeNode classNode = (DefaultMutableTreeNode) packageNode.getChildAt(j);
                // 加个判断确保只处理叶子节点(避免万一包下面还有子包的情况)
                if (classNode.isLeaf()) {
                    String module = classNode.toString();
                    String modulename = FilenameUtils.getBaseName(module);
                    System.out.println("----" + modulename + "***");
                }
            }
        }
    }
});

更通用的递归方案(支持多层包结构)

如果你的项目里有嵌套包(比如包下面还有子包),那上面的代码就不够用了,推荐用递归遍历,不管树有多少层,都能找到所有叶子节点:

// 先写一个递归遍历的工具方法
private void printAllLeafClasses(DefaultMutableTreeNode currentNode) {
    // 如果当前节点是叶子(也就是类),就打印
    if (currentNode.isLeaf()) {
        String modulename = FilenameUtils.getBaseName(currentNode.toString());
        System.out.println("----" + modulename + "***");
        return;
    }
    // 如果不是叶子(是包),就遍历它的所有子节点,递归处理
    for (int i = 0; i < currentNode.getChildCount(); i++) {
        DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) currentNode.getChildAt(i);
        printAllLeafClasses(childNode);
    }
}

// 按钮事件里调用这个方法
btnG.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        TreeModel model = tree.getModel();
        DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
        printAllLeafClasses(root);
    }
});

这样不管你的包结构有多深,所有的类节点都会被打印出来,再也不会出现漏打的情况。

内容的提问来源于stack exchange,提问作者Sara Belaid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:57:49