2

我有可以过滤的 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 可能是问题所在?

是路径有效():

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;
}
4

1 回答 1

1

我知道这是一篇旧帖子,但在解决类似问题一小时后,我将把我的发现放在这里。

方法“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);
}
于 2017-04-05T05:14:37.067 回答