过滤后的JXTreeTable expandPath

时间:2014-04-29 11:43:46

标签: java swing swingx jxtreetable

我有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;
}

1 个答案:

答案 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);
}