JavaFX仅扩展包含特定Child的TreeView父级

时间:2017-12-29 00:29:28

标签: java recursion javafx treeview

我遇到的问题是获取包含特定Child以折叠/扩展的TreeView节点,而不是每个TreeView节点/父节点都要崩溃。我尝试了一次大失败的递归,并且无法意识到解决方案可能是什么。

以下是我的代码:

public void setTreeItem(Employee emp, TreeItem<Employee> root_tree) {
    if (emp.equals(root_tree.getValue())) {
        root_tree.setExpanded(false);
    } else {
        root_tree.setExpanded(true);
        for (TreeItem<Employee> emps : root_tree.getChildren()) {
            setTreeItem(emp, emps);
        }
    }
}

我达到了这一点,不能再进一步了。作为参考,我检查了这个topic,但我无法从该解决方案中获得想法。

这些是用于演示的图片:

first picture

这是检查特定元素之前的图片

second picture

这是检查该特定元素后的照片(Mary Johnson)。

正如你所看到的,它遍历整个TreeView并扩展了所有TreeView父母,但毕竟Mary Johnson不在那里。

1 个答案:

答案 0 :(得分:1)

即使您搜索的项目不是项目的后代,也可以在非终端案例中展开TreeItem。由于您遍历整个树,所有节点都会扩展。要解决此问题,请提供反馈作为返回值:

public boolean setTreeItem(Employee emp, TreeItem<Employee> root_tree) {
    if (emp.equals(root_tree.getValue())) {
        root_tree.setExpanded(false);
        return true;
    } else {
        for (TreeItem<Employee> emps : root_tree.getChildren()) {
            if (setTreeItem(emp, emps)) {
                // expand & return true, if item is a descendant of the current item
                root_tree.setExpanded(true);
                return true;
            }
        }
        return false; // set expanded to false before returning here?
    }
}

您还可以返回包含您搜索的值的truefalse,而不是返回TreeItem / null,然后在循环中展开项目

TreeItem<String> item = searchItem(someString, root);
if (item != null) {
    item.setExpanded(false);
    item = item.getParent();
    while (item != null) {
        item.setExpanded(true);
        item = item.getParent();
    }
}