我有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;
}发布于 2017-04-05 05:14:37
我知道这是一篇老文章,但我会把我的发现放在这里,花一个小时在类似的问题上。
方法"isPathValid“仅通过检查子(x)是否属于父(x-1)来验证序列是否正确,但它不验证根是否与表模型相同(除非路径计数为零)。
过滤时,通常会触发表模型的新根,因此,如果在更新模型(并触发新根)之前捕获TreePaths,则表将无法找到路径,尽管路径本身是有效的。
它应该与以下几项修改一起工作:
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);
}https://stackoverflow.com/questions/23363739
复制相似问题