获取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
相关产品推荐
相关产品推荐

