[英]How to search JavaFX TreeView for next TreeItem?
我想設置一些搜索功能,以便當您在TextField中鍵入文本並按Enter時,它將在TreeView中找到該字符串的第一個實例。 然后,當再次按Enter鍵時,它將找到第二個實例,再次按它將會找到第三個實例,等等。
能夠搜索TreeView並找到第一個包含文本的TreeItem似乎並不難,但是我不確定如何繼續在TreeView上搜索包含該文本的其他TreeItem。 我想在TreeView中搜索所有文件夾/文檔將需要某種遞歸功能,但是不確定。 因此,我想問一問是否有人能夠提供一個示例或一些有關如何創建此搜索功能的提示。 任何幫助,將不勝感激 :)
德魯
您可以使用遞歸函數來搜索樹。
在下面的代碼中,我維護了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;
}
}
請注意,如果您不想使用遞歸,還可以使用樹迭代器並在循環中對其進行迭代
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.