我遇到的问题是让包含特定子节点的 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但我无法真正从该解决方案中得到想法。
这些是演示图片:
这是检查特定元素之前的图片
这是检查特定元素(玛丽·约翰逊)后的图片。
正如您所看到的,它遍历整个 TreeView 并扩展所有 TreeView 父级,但毕竟 Mary Johnson 不在那里。
最佳答案
即使您搜索的项目不是该项目的后代,您也可以在非终结符情况下展开 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?
}
}
除了返回 true
/false
,您还可以返回包含您搜索的值的 TreeItem
或 null
code> 并稍后在循环中展开项目
TreeItem<String> item = searchItem(someString, root);
if (item != null) {
item.setExpanded(false);
item = item.getParent();
while (item != null) {
item.setExpanded(true);
item = item.getParent();
}
}
关于JavaFX 仅展开包含特定子级的 TreeView 父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48016041/