得到jtree的所有叶子

时间:2018-05-19 09:54:23

标签: java

在我的jtree中,我导入了一个包含2个包和30个类的项目java。 我会用一个按钮来完成所有这些课程,但是这个代码完美无缺,它只能完成22个课程(叶子)。你可以帮助我吗,请^ _ ^

btnG.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            TreeModel model = tree.getModel();
            DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();
             int packageCount = root.getChildCount();
             int  classCount=root.getLeafCount();

             for(int j = 0; j < classCount; j++){
                for(int i = 0; i < packageCount; i++){
                //------------------ package name-------------//
                String module = (String) root.getChildAt(i).getChildAt(j).toString();
                 String modulename = FilenameUtils.getBaseName(module);
                 System.out.println("----"+modulename+"***");
                //------------------ modules name-------------//
            }}
        }
    });

3 个答案:

答案 0 :(得分:1)

         int packageCount = root.getChildCount();
         int  classCount=root.getLeafCount();

         for(int j = 0; j < classCount; j++){
            for(int i = 0; i < packageCount; i++){

您无法为内循环使用预定值。每个节点可以具有不同数量的叶子。例如,一个包可以有10个类,另一个包可以包含20个类。

您需要编写一个通用循环,它根据每个节点中的子节点数进行迭代。

类似的东西:

TreeModel model = tree.getModel();
DefaultMutableTreeNode root = (DefaultMutableTreeNode) model.getRoot();

for (int i = 0; i < root.getChildCount(); i++)
{
    DefaultMutableTreeNode child = (DefaultMutableTreeNode)root.getChildAt(i);
    System.out.println(child);

    for (int j = 0; j < child.getChildCount(); j++)
    {
        System.out.println("  - " + child.getChildAt(j));
    }
}

当然,这假设您只有两个级别的节点。

正确的解决方案是使用递归来遍历所有孩子。

答案 1 :(得分:0)

你需要交换for循环,外部循环应该用于包和内部用于类,你需要检查每个包有多少个类,即在包循环中每次设置classCount变量< / p>

int packageCount = root.getChildCount();

for(int i = 0; i < packageCount; i++){
    classCount = root.getChildAt(i).getLeafCount();
    for(int j = 0; j < classCount; j++){
        //------------------ package name-------------//
        String module = (String) root.getChildAt(i).getChildAt(j).toString();
        String modulename = FilenameUtils.getBaseName(module);
        System.out.println("----"+modulename+"***");
        //----
    }
}

这里我假设没有子包,如果有一个解决方案是将上面的代码移动到一个递归调用的单独方法

答案 2 :(得分:0)

我认为递归实现更合适,因为它适用于树的任何深度。这是示例:

public static ArrayList<DefaultMutableTreeNode> getLeafNodes(DefaultMutableTreeNode root) {
    ArrayList<DefaultMutableTreeNode> leafs = new ArrayList<>();
    JTreeTools._getLeafNodes(root, leafs);
    return leafs;
}
private static void _getLeafNodes(DefaultMutableTreeNode parent, ArrayList<DefaultMutableTreeNode> leafs) {
    Enumeration children = parent.children();
    while (children.hasMoreElements()) {
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) children.nextElement();
        if (node.isLeaf()) {
            leafs.add(node);
        } else {
            _getLeafNodes(node, leafs);
        }
    }
}