首页
学习
活动
专区
圈层
工具
发布

搜索JTree
EN

Stack Overflow用户
提问于 2010-08-12 22:25:45
回答 2查看 3.5K关注 0票数 1

我有一个JTree,我正在尝试搜索它。我已经写了一个快速的递归搜索函数。该函数将父/子节点名称对作为字符串。

代码语言:javascript
复制
private void RecursiveSearch(javax.swing.tree.DefaultMutableTreeNode node, java.util.ArrayList<TreeNode> nodelist, java.lang.String destination, java.lang.String origin) {
     nodelist.add(node);
     Controller.TreeData parentdata = (Controller.TreeData)node.getUserObject();
     for(int i = 0; i < node.getChildCount(); i++) {
        javax.swing.tree.DefaultMutableTreeNode childnode = (javax.swing.tree.DefaultMutableTreeNode)node.getChildAt(i);
        Controller.TreeData childdata = (Controller.TreeData)childnode.getUserObject();
        if (parentdata.GetName().trim().toUpperCase().equals(origin) && childdata.GetName().trim().toUpperCase().equals(destination)) {
            nodelist.add(childnode);
            return;
        }
    }
    // We didn't find it. Recurse.
    for(int i = 0; i < node.getChildCount(); i++) {
        RecursiveSearch((javax.swing.tree.DefaultMutableTreeNode)node.getChildAt(i), nodelist, destination, origin);
    }
    nodelist.remove(node);
}

然而,它没有在应该返回值的时候返回值。我从TreeModel获得了根节点,数组开始时是空的。我检查了JTree和TreeModel,它们似乎都没有提供任何类型的搜索功能。有什么建议吗?

编辑:我不打算解释我的原始函数(它最初是用另一种语言编写的)。但我将其替换为:

代码语言:javascript
复制
javax.swing.tree.DefaultMutableTreeNode rootnode = (javax.swing.tree.DefaultMutableTreeNode)datatree.getModel().getRoot();
java.util.Enumeration nodeenum = rootnode.breadthFirstEnumeration();
while(nodeenum.hasMoreElements()) {
    javax.swing.tree.DefaultMutableTreeNode nextnode = (javax.swing.tree.DefaultMutableTreeNode)nodeenum.nextElement();
    Controller.TreeData data = (Controller.TreeData)nextnode.getUserObject();
    javax.swing.tree.DefaultMutableTreeNode parentnode = (javax.swing.tree.DefaultMutableTreeNode)nextnode.getParent();
    Controller.TreeData parentdata = (Controller.TreeData)(parentnode.getUserObject());
    if (parentdata.GetName().trim().toUpperCase().equals(origin) && data.GetName().trim().toUpperCase().equals(destination)) {
        datatree.setSelectionPath(new javax.swing.tree.TreePath(treemodel.getPathToRoot(nextnode)));
        return;
    }
}
javax.swing.JOptionPane.showMessageDialog(primaryframe, "Could not find the requested depots");

然而,它实际上似乎没有找到任何东西。我从根节点开始,所以它应该枚举整个树。修复了此版本中的空指针异常错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-13 00:51:08

我有几点建议

  • 如果源、目标的父、子对在树中出现超过一次,此代码将不起作用。你只能找到第一对,跳过它的子树,它可以包含更多的实例,
  • ,我不知道为什么你在开头添加节点,在结尾删除它。当你找到两个节点(父节点,子节点)时,添加两个节点(父节点,子节点)要简单得多。
  • 你可以优化你的代码,所以如果parentnode != origin,你不会测试所有的父节点,子节点对。如果此测试失败,请跳过第一个循环

你能提供一些示例I/O,这样我就可以确定你想要的结果是什么。

名字origindestination听起来不像是直接的子级。origindestination之间的路径可以长于1吗?

票数 2
EN

Stack Overflow用户

发布于 2010-08-13 00:55:15

如果你在你的TreeModel中使用DefaultMutableTreeNode,你可以简单地使用breadthFirstEnumeration()depthFirstEnumeration()来搜索树。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3468721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档