1

我有一个 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");

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

4

2 回答 2

3

如果你在你的范围内使用DefaultMutableTreeNodes,TreeModel你可以简单地使用breadthFirstEnumeration()ordepthFirstEnumeration()来搜索树。

于 2010-08-12T16:55:15.073 回答
2

我有几个建议

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

您能否提供一些示例 I/O,以便我确定您想要的结果是什么。

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

于 2010-08-12T16:51:08.057 回答