2017-05-20 2 views
3

Je voudrais configurer certaines fonctionnalités de recherche de sorte que lorsque vous tapez du texte dans un TextField et appuyez sur Entrée, il trouve la première instance de cette chaîne dans un TreeView. Ensuite, lorsque vous appuyez sur Entrée à nouveau, il va trouver la deuxième instance, en appuyant à nouveau va trouver le troisième, ect ...Comment rechercher JavaFX TreeView pour TreeItem suivant?

Il ne semble pas trop difficile de pouvoir rechercher un TreeView et trouver le premier TreeItem contenant du texte, mais je ne sais pas comment continuer à chercher dans le TreeView pour d'autres TreeItems contenant ledit texte. J'imagine que la recherche dans tous les dossiers/documents à l'intérieur d'un TreeView nécessiterait une sorte de fonction récursive, mais je ne suis pas sûr. Je voudrais donc demander si quelqu'un pourrait être en mesure de fournir un exemple ou quelques conseils sur la façon de créer cette fonctionnalité de recherche. Toute aide serait appréciée :)

Drew

Répondre

0

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

+0

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. –

+0

@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

+1

J'ai été capable d'utiliser cela pour écrire quelque chose qui correspond à mes besoins. Merci pour votre temps un effort :) –