J'ai un JTree, que j'essaie de rechercher. J'ai écrit une fonction de recherche rapide et récursive. La fonction prend une paire de noms de nœuds parent/enfant en tant que chaîne.Recherche d'un 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);
}
Cependant, il ne renvoie pas de valeurs lorsqu'il devrait l'être. J'ai reçu le nœud racine du TreeModel et le tableau commence vide. J'ai vérifié le JTree et le TreeModel et aucun d'eux ne semble offrir une sorte de fonctionnalité de recherche. Aucune suggestion?
Edit: Je ne vais pas essayer d'expliquer ma fonction d'origine (il a été écrit à l'origine dans une autre langue). Mais je l'ai remplacé par ceci:
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");
Cependant, il ne semble pas vraiment trouver quelque chose. J'ai commencé avec le nœud racine, donc il devrait énumérer l'arbre entier. Correction du bogue de l'exception du pointeur nul dans cette version.
Retour des valeurs? C'est une fonction "vide". Est-ce que vous essayez de le faire modifier le JTree d'une certaine façon? Quel comportement essayez-vous d'atteindre? –
Pourquoi ajouter tous les éléments au départ et les supprimer à la fin? – jethro
Si j'étais vous je voudrais essayer d'utiliser le débogueur. Etes-vous sûr que data.GetName(). Trim(). ToUpperCase() renvoie ce que vous attendez et transmet comme arguments (origine, destination)? Avez-vous vérifié si tous les nœuds sont visités? Êtes-vous sûr de ne pas modifier la structure ou les données d'un autre thread? – jethro