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

时间:2017-05-20 17:02:29

标签: java javafx treeview javafx-8

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

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

德鲁

1 个答案:

答案 0 :(得分:1)

您可以使用重复功能搜索树。

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

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

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