Java 搜索JTree

Java 搜索JTree,java,swing,search,jtree,Java,Swing,Search,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(

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

我有一些建议

  • 若父、子源、目标对在树中多次出现,则此代码将不起作用。您只能找到第一对,并跳过其子树,该子树可以包含更多事件
  • 我不知道为什么要在开头添加节点,然后在结尾删除它。更简单的方法是在找到节点时同时添加两个节点(父节点、子节点)
  • 您可以优化代码,以便在parentnode!=原点:不测试所有父、子对。如果此测试
    parentdata.GetName().trim().toUpperCase().equals(原点)
    失败,则跳过第一个循环
您能否提供一些I/O示例,以便我确定您想要的结果是什么

名字
origin
destination
听起来好像你没有寻找直系子女。
origin
destination
之间的路径能比1长吗?

我有一些建议

  • 若父、子源、目标对在树中多次出现,则此代码将不起作用。您只能找到第一对,并跳过其子树,该子树可以包含更多事件
  • 我不知道为什么要在开头添加节点,然后在结尾删除它。更简单的方法是在找到节点时同时添加两个节点(父节点、子节点)
  • 您可以优化代码,以便在parentnode!=原点:不测试所有父、子对。如果此测试
    parentdata.GetName().trim().toUpperCase().equals(原点)
    失败,则跳过第一个循环
您能否提供一些I/O示例,以便我确定您想要的结果是什么


名字
origin
destination
听起来好像你没有寻找直系子女。
原点
目的地
之间的路径是否比1长?

如果在中使用s wihtin,则可以简单地使用或搜索树。

如果在中使用s wihtin,则可以简单地使用或搜索树。

返回值?这是一个
void
函数。您是否试图让它以某种方式修改JTree?您试图实现什么行为?为什么在开始时添加每个元素,在结束时删除它?如果我是您,我会尝试使用调试器。您确定data.GetName().trim().toUpperCase()返回您所期望的并作为参数(起点、终点)传递的内容吗?是否已检查是否访问了所有节点?您确定不修改其他线程中的结构或数据?返回值?这是一个
void
函数。您是否试图让它以某种方式修改JTree?您试图实现什么行为?为什么在开始时添加每个元素,在结束时删除它?如果我是您,我会尝试使用调试器。您确定data.GetName().trim().toUpperCase()返回您所期望的并作为参数(起点、终点)传递的内容吗?是否已检查是否访问了所有节点?你确定不修改其他线程中的结构或数据吗?我到底该如何使用这些枚举来构建树路径以便可以选择它?简单-将DefaultTreeModel与DefaultMutableTreeNode结合使用。使用上述搜索方法之一找到所需的TreeNode,然后调用DefaultTreeModel的getPathToRoot(TreeNode)。我究竟如何使用这些枚举来构建树路径,以便可以选择它?简单-将DefaultTreeModel与DefaultMutableTreeNode结合使用。使用上述搜索方法之一找到所需的TreeNode,然后调用DefaultTreeModel的getPathToRoot(TreeNode)。这是winrar。我将数据大写,但忘了将检查的输入大写。这是winrar。我将数据大写,但忘记将我正在检查的输入大写。
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");