如何在JavaFXTreeView中搜索下一个TreeItem?

如何在JavaFXTreeView中搜索下一个TreeItem?,java,javafx,treeview,javafx-8,Java,Javafx,Treeview,Javafx 8,我想设置一些搜索功能,这样当您在文本字段中键入文本并按enter键时,它会在树视图中找到该字符串的第一个实例。然后,当您再次按enter键时,它将查找第二个实例,再次按它将查找第三个实例,等等 搜索一个树状视图并找到第一个包含文本的树状图似乎并不难,但我不确定如何继续在树状视图下搜索包含所述文本的其他树状图。我想搜索树视图中的所有文件夹/文档需要某种递归功能,但我不确定。因此,我想问一下,是否有人能够提供一个示例或一些如何创建此搜索功能的提示。任何帮助都将不胜感激:) Drew您可以使用Recr

我想设置一些搜索功能,这样当您在文本字段中键入文本并按enter键时,它会在树视图中找到该字符串的第一个实例。然后,当您再次按enter键时,它将查找第二个实例,再次按它将查找第三个实例,等等

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


Drew

您可以使用Recrive函数在树中搜索

在下面的代码中,我维护了一个实例变量,它保存了
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;
}
}
公共类TreeViewSample扩展应用程序{
私有整数计数=0;
私家树;
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
公共无效开始(阶段primaryStage){
setTitle(“树视图示例”);
TextField txtField=新建TextField();
按钮搜索BTN=新按钮(“搜索”);
setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
计数=0;
}
});
TreeItem rootItem=新的TreeItem(“根”);
setExpanded(true);
TreeItem1=新的TreeItem(“子项1”);
TreeItem12=新的TreeItem(“子12”);
item1.getChildren().add(item12);
TreeItem2=新的TreeItem(“子项2”);
TreeItem21=新的TreeItem(“儿童21”);
item2.getChildren().add(item21);
TreeItem211=新的TreeItem(“子12”);
item21.getChildren().add(item211);
TreeItem3=新的TreeItem(“子项3”);
TreeItem31=新的TreeItem(“孩子12”);
item3.getChildren().add(item31);
getChildren().addAll(item1、item2、item3);
searchBtn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
计数++;
handleSearch(rootItem,txtField.getText());
}
});
this.tree=新树视图(rootItem);
VBox root=新的VBox();
root.getChildren().addAll(树、txtField、searchBtn);
原始阶段。设置场景(新场景(根,300250));
primaryStage.show();
}
受保护的int handleSearch(TreeItem rootItem,字符串文本){
整数计数=0;
if(rootItem!=null&&rootItem.getValue().equals(text)){
tree.getSelectionModel().select(rootItem);
返回1;
}
if(rootItem!=null&&!rootItem.getChildren().isEmpty()){
for(TreeItem TreeItem:rootItem.getChildren()){
count+=handleSearch(treeItem,text);
if(this.count==count){
打破
}
}
}
返回计数;
}
}

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

嘿,Oswald,谢谢您的回复!这是一种有趣的方法,但不幸的是,它在大多数情况下都不能准确地递增count变量,并且在到达树的末尾时不会循环到开始处。@DrewB我知道我的代码写得不好,但是也许你可以扩展递归函数的方法来满足你的需要:)我可以用它来写一些适合我需要的东西。感谢您的时间和努力:)