gpt4 book ai didi

java - 使用文本字段搜索/过滤 TreeView

转载 作者:行者123 更新时间:2023-11-29 08:30:31 26 4
gpt4 key购买 nike

我一直在努力寻找这个问题的答案,但这似乎是一件非常复杂的事情。

我想做的是我有一个 TreeView 和一个文本字段,我希望能够搜索,因此只有 TreeView 中与文本字段上的内容匹配的树项才会显示。

例如,如果有人在文本字段中写入“lat”, TreeView 会显示“latency”、“latvia”等文件夹。

TreeView 填充代码是这样的

@FXML
private void fillTreeView() {
// The tree needs a root, and it needs to be a DocumentObject
// so we create an empty folder and hide it
TreeItem<DocumentObject<?>> treeRoot = new TreeItem<>(new Folder());

for (Folder folder : logic.getFolderList()) {
TreeItem<DocumentObject<?>> folderNode = new TreeItem<>(folder);

for (FileReference file : folder.getFileList()) {
TreeItem<DocumentObject<?>> fileNode = new TreeItem<>(file);
folderNode.getChildren().add(fileNode);
}

treeRoot.getChildren().add(folderNode);
treeRoot.setExpanded(true);
}

treeNav.setRoot(treeRoot);
treeNav.setShowRoot(false);
}

然后我希望文本字段搜索两个树项并显示用户搜索的内容

最佳答案

如果您只过滤根节点的直接子节点,则相当简单。只需将顶级节点保存在单独的 ObservableList 中,用 FilteredList 包裹它,然后使用 Bindings.bindContent() 确保根节点的子节点列表包含与 FilteredList 相同的元素。

假设您的 DocumentObject 有一个方法,比如说 getName(),它返回您要对其应用过滤器的文本,并且您有一个 TextField 称为 textField,用户在其中键入过滤文本,这看起来像:

@FXML
private void fillTreeView() {
// The tree needs a root, and it needs to be a DocumentObject
// so we create an empty folder and hide it
TreeItem<DocumentObject<?>> treeRoot = new TreeItem<>(new Folder());

ObservableList<TreeItem<DocumentObject<?>>> firstLevel = FXCollections.observableArrayList();

for (Folder folder : logic.getFolderList()) {
TreeItem<DocumentObject<?>> folderNode = new TreeItem<>(folder);

for (FileReference file : folder.getFileList()) {
TreeItem<DocumentObject<?>> fileNode = new TreeItem<>(file);
folderNode.getChildren().add(fileNode);
}

firstLevel.add(folderNode);
}

treeRoot.setExpanded(true);


FilteredList<TreeItem<DocumentObject<?>>> filteredList = new FilteredList<>(firstLevel, item -> true);

filteredList.predicateProperty().bind(Bindings.createObjectBinding(() -> {
String filter = textField.getText();
if (filter.isEmpty()) return item -> true ;
return item -> item.getValue().getName().startsWith(filter) ; // your implementation may vary...
}, textField.textProperty());

Bindings.bindContent(treeRoot.getChildren(), filteredList);

treeNav.setRoot(treeRoot);
treeNav.setShowRoot(false);
}

如果你想过滤整棵树,那么你需要在每一层做同样的事情....

关于java - 使用文本字段搜索/过滤 TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48672861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com