[英]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");
但是,它实际上似乎找不到任何东西。 我从根节点开始,所以它应该枚举整个树。 修复了此版本中的空指针异常错误。
我的建议很少
parentdata.GetName().trim().toUpperCase().equals(origin)
失败跳过第一个循环 你能提供一些I / O示例,这样我就可以确定你想要的结果是什么。
姓名origin
和destination
声音就像你不寻找直接的孩子一样。 origin
和destination
之间的路径可以长于1吗?
如果您使用DefaultMutableTreeNode
与您的TreeModel
使用,您只需使用breadthFirstEnumeration()
或depthFirstEnumeration()
来搜索树。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.