繁体   English   中英

搜索JTree

[英]Searching a JTree

我有一个JTree,我试图搜索。 我写了一个快速的递归搜索功能。 该函数将父/子节点名称对作为字符串。

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,它们似乎都没有提供任何类型的搜索功能。 有什么建议么?

编辑:我不会尝试解释我的原始功能(它最初是用另一种语言编写的)。 但我用这个代替了它:

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");

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

我的建议很少

  • 如果父,子对原点,目标在树中出现多次,则此代码将不起作用。 您只能找到第一对并跳过可包含更多出现的子树
  • 我不知道为什么你在开始时添加节点并在结束时删除它。 更简单的是在找到它们时添加两个节点(父节点,子节点)。
  • 你可以优化你的代码,所以如果parentnode!= origin你不测试所有的父,子对。 如果这个测试parentdata.GetName().trim().toUpperCase().equals(origin)失败跳过第一个循环

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

姓名origindestination声音就像你不寻找直接的孩子一样。 origindestination之间的路径可以长于1吗?

如果您使用DefaultMutableTreeNode与您的TreeModel使用,您只需使用breadthFirstEnumeration()depthFirstEnumeration()来搜索树。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM