我有JXTreeTable可以过滤。当我过滤关键字时,会设置新模型。它适用于我。
现在我想扩展所有过滤结果。为此,我保存找到匹配节点的位置。 (它不能成为一片叶子。)
对于那些位置,我使用这种方法创建了一个TreePaths列表:
public TreePath getPath(TreeNode node) {
List<TreeNode> list = new ArrayList<TreeNode>();
while (node != null) {
list.add(node);
node = node.getParent();
}
Collections.reverse(list);
return new TreePath(list.toArray());
}
现在我迭代这个列表并调用expandPath(在设置新模型之后) 其中getTreePaths()是我之前使用该方法创建的TreePaths列表。
for (TreePath elem : f.getTreePaths()) {
tree.expandPath(elem);
tree.scrollPathToVisible(elem);
}
但它没有效果,只有根被扩展,所有子节点都被折叠了。 在TreePath中,最后一个元素是没有叶子。在这个循环的System.out中,我得到了所有:
-1 真正 真正 真
的System.out.println(tree.getRowForPath(ELEM));的System.out.println(f.isPathValid(ELEM,tree.getTreeTableModel())); 的System.out.println(tree.isVisible(ELEM)); 的System.out.println(tree.isExpanded(ELEM));
getRowForPath的-1可能是问题吗?
isPathValid():
public boolean isPathValid(TreePath path,TreeTableModel model) {
if (path.getPathCount() == 0) {
return model.getRoot().equals(path.getPathComponent(0));
}
for (int x = 1; x < path.getPathCount(); x++) {
if (model.getIndexOfChild(path.getPathComponent(x - 1),
path.getPathComponent(x)) == -1) {
return false;
}
}
return true;
}
答案 0 :(得分:1)
我知道这是一篇很老的帖子,但是在我花了一个小时处理类似的问题后,我会把这些结果放在这里。
方法&#34; isPathValid&#34;仅通过检查子(x)是否属于父(x-1)来验证序列是否正确,但它不验证根是否与表模型相同(除非路径计数为零) )。
过滤时,通常会触发表模型的新根,因此如果您在&#34;之前捕获了TreePaths&#34;更新模型(并触发新的根),表格无法找到路径,尽管路径本身有效。
它应该有一些变化:
public **List** getPath(TreeNode node) {
List<TreeNode> list = new ArrayList<TreeNode>();
**while (node != model.getRoot()) {**
list.add(node);
node = node.getParent();
}
Collections.reverse(list);
**return list;**
}
**for (List elem : f.getTreePaths()) {**
elem.add(0, model.getRoot());
tree.expandPath(new TreePath(elem.toArray());
tree.scrollPathToVisible(elem);
}