如何在下一个TreeItem中搜索JavaFX TreeView?

我想设置一些搜索功能,以便当您在TextField中键入文本并按Enter键时,它会在TreeView中找到该String的第一个实例.然后,当你再次按回车键时,它会找到第二个实例,再次按下它会找到第三个实例,等等…

能够搜索TreeView并找到包含文本的第一个TreeItem似乎并不太难,但我不确定如何继续在TreeView中搜索包含所述文本的其他TreeItem.我想在TreeView中搜索所有文件夹/文件需要某种递归功能,但我不确定.因此,我想问一下是否有人可以提供一个示例或一些如何创建此搜索功能的提示.任何帮助,将不胜感激 :)

德鲁

最佳答案 你可以通过recurive函数搜索树.

在下面的代码中,我保留了1个实例变量,它保存了clickBtn被点击的次数,虽然这解决了问题,但不是最佳,当用户再次点击搜索按钮但它获得下一个匹配时,它会遍历树从一开始(不是从上一场比赛开始),你现在可以用它作为解决方案,我会尝试在同一时间内提出一个更优的解决方案

 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;
}
}

请注意,如果您不想使用递归,也可以使用树迭代器并在循环中迭代它

点赞