Vous pouvez une fonction récursive pour rechercher dans l'arborescence.
Dans le code ci-dessous j'ai maintenu 1 variable d'instance il contient le nombre de fois que searchBtn
a été cliqué, bien que cela résout la question, ce n'est pas tout à fait optimal, lorsque l'utilisateur clique à nouveau sur le bouton de recherche , il traverse l'arbre depuis le début (pas du match précédent), vous pouvez l'utiliser comme une solution pour l'instant, je vais essayer de trouver une solution plus optimale dans le temps moyen
public class TreeViewSample extends Application {
private int count=0;
private TreeView<String> tree;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Tree View Sample");
TextField txtField=new TextField();
Button searchBtn=new Button("Search");
txtField.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
count=0;
}
});
TreeItem<String> rootItem = new TreeItem<String> ("Root");
rootItem.setExpanded(true);
TreeItem<String> item1 = new TreeItem<String> ("Child 1");
TreeItem<String> item12 = new TreeItem<String> ("Child 12");
item1.getChildren().add(item12);
TreeItem<String> item2 = new TreeItem<String> ("Child 2");
TreeItem<String> item21 = new TreeItem<String> ("Child 21");
item2.getChildren().add(item21);
TreeItem<String> item211 = new TreeItem<String> ("Child 12");
item21.getChildren().add(item211);
TreeItem<String> item3 = new TreeItem<String> ("Child 3");
TreeItem<String> item31 = new TreeItem<String> ("Child 12");
item3.getChildren().add(item31);
rootItem.getChildren().addAll(item1,item2,item3);
searchBtn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
count++;
handleSearch(rootItem,txtField.getText());
}
});
this.tree = new TreeView<String> (rootItem);
VBox root = new VBox();
root.getChildren().addAll(tree,txtField,searchBtn);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
protected int handleSearch(TreeItem<String> rootItem, String text) {
int count=0;
if(rootItem!=null&&rootItem.getValue().equals(text)){
tree.getSelectionModel().select(rootItem);
return 1;
}
if(rootItem!=null&&!rootItem.getChildren().isEmpty()){
for(TreeItem<String> treeItem: rootItem.getChildren()){
count+=handleSearch(treeItem, text);
if(this.count==count){
break;
}
}
}
return count;
}
}
de noter que vous pouvez également utiliser un itérateur d'arbre et l'itérer en boucle, si vous ne voulez pas utiliser les récursions
Hey Oswald, merci pour votre réponse! C'est une approche intéressante, mais malheureusement, elle n'incrémente pas la variable de comptage avec précision la plupart du temps et ne boucle pas au début lorsque la fin de l'arbre est atteinte. –
@DrewB Je comprends que mon code n'est pas bien écrit, mais peut-être que vous pourriez étendre l'approche de la fonction récursive pour répondre à vos besoins :) – Oswald
J'ai été capable d'utiliser cela pour écrire quelque chose qui correspond à mes besoins. Merci pour votre temps un effort :) –