Java 从结构为路径的字符串数组填充JTree

Java 从结构为路径的字符串数组填充JTree,java,jtree,Java,Jtree,我的Java项目需要帮助。如何从以路径为模式的字符串数组中动态填充JTree?。 比如,弦 paths[][]={{"Animals", "Birds","Non_flying" ,"Chicken"}, {"Animals","Birds","Non_flying","Ostrich"}, {"Animals","Birds","Flying","Eagle"}, {"Animals","Birds","Flying","Crow"}, {"Animals","Reptiles","Liza

我的Java项目需要帮助。如何从以路径为模式的字符串数组中动态填充JTree?。 比如,弦

paths[][]={{"Animals", "Birds","Non_flying" ,"Chicken"},
{"Animals","Birds","Non_flying","Ostrich"}, 
{"Animals","Birds","Flying","Eagle"},
{"Animals","Birds","Flying","Crow"},
{"Animals","Reptiles","Lizard"},
{"Plants"," Fruit Bearing","Fruits","Mango"},
{"Plants"," Fruit Bearing","Vegetable","Eggplant"},
{"Plants"," Non-fruit Bearing","Sunflower"}};
我尝试了下面的代码,但它没有合并类似的节点。必须是treeify()方法中的条件:

import javax.swing.JScrollPane;
导入javax.swing.JTree;
导入javax.swing.tree.DefaultMutableTreeNode;
公共类TreeTest扩展了javax.swing.JFrame{
静态JTree树;
公共静态void setTree(){
字符串路径[][]={{“动物”、“鸟类”、“非飞行”、“鸡”},
{“动物”、“鸟类”、“非飞行”、“鸵鸟”},
{“动物”、“鸟”、“飞行”、“鹰”},
{“动物”、“鸟”、“飞行”、“乌鸦”},
{“动物”、“爬行动物”、“蜥蜴”},
{“植物”、“结果”、“果实”、“芒果”},
{“植物”、“果实”、“蔬菜”、“茄子”},
{“植物”、“不结果实”、“向日葵”};
树=新的JTree(树(路径));
}
公共静态DefaultMutableTreeNode树索引(字符串[][]路径){
DefaultMutableTreeNode根=null;
DefaultMutableTreeNode子轨迹=null;
对于(字符串[]父:路径)
for(字符串值:父级){
if(root==null){
root=新的DefaultMutableTreeNode(值);
}else if(subRoot==null){
subRoot=新的DefaultMutableTreeNode(值);
root.add(subRoot);
}否则{
DefaultMutableTreeNode子节点=新的DefaultMutableTreeNode(值);
子循环。添加(子循环);
子轨道=子轨道;
}
}
返回根;
}
公共静态void main(字符串[]args){
树测试=新树测试();
setTree();
test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(新的JScrollPane(树));
测试设置尺寸(500400);
test.setLocationRelativeTo(空);
test.setVisible(真);
}
}

下面是一个版本的
treeify()
,它实现了我在评论中概述的策略。这不是有史以来最优雅的事情,但它完成了任务:

public static DefaultMutableTreeNode treeify(String[][] paths) {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    for ( String[] path : paths) {
        DefaultMutableTreeNode curr = root;
        for ( String value : path){
            DefaultMutableTreeNode next = null;
            Enumeration ce = curr.children();
            while (ce.hasMoreElements()){
                DefaultMutableTreeNode kid = 
                    (DefaultMutableTreeNode) ce.nextElement();
                if (((String)kid.getUserObject()).equals(value)){
                    next = kid;
                    break;
                }
            }
            if (next == null){
                next = new DefaultMutableTreeNode(value);
                curr.add(next);
            }
            curr = next;
        }
    }
    return root; 
}

您必须搜索正在构建的模型,以了解新节点的位置。假设您正在尝试添加
{“动物”、“鸟”、“非飞行”、“鸡”}
。以根节点作为“当前”节点,查找名为
“Animals”的子节点
;如果找不到,请添加一个空的
“Animals”
节点作为“current”的子节点。现在,将发现或添加的
“动物”
节点设置为新的“当前”节点,并通过其子节点查找
“鸟类”
节点,如有必要,将其添加,等等……任何可以在此处为我提供代码的人。我是JTree的新手。花了两周时间解决这个问题,结果什么都没用。
public static DefaultMutableTreeNode treeify(String[][] paths) {
    DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    for ( String[] path : paths) {
        DefaultMutableTreeNode curr = root;
        for ( String value : path){
            DefaultMutableTreeNode next = null;
            Enumeration ce = curr.children();
            while (ce.hasMoreElements()){
                DefaultMutableTreeNode kid = 
                    (DefaultMutableTreeNode) ce.nextElement();
                if (((String)kid.getUserObject()).equals(value)){
                    next = kid;
                    break;
                }
            }
            if (next == null){
                next = new DefaultMutableTreeNode(value);
                curr.add(next);
            }
            curr = next;
        }
    }
    return root; 
}