Java 过滤后的JXTreeTable expandPath

Java 过滤后的JXTreeTable expandPath,java,swing,swingx,jxtreetable,Java,Swing,Swingx,Jxtreetable,我有JXTreeTable,可以对其进行筛选。过滤关键字时,将设置一个新模型。对我来说没问题 现在,我想展开所有过滤结果。为此,我保存了找到匹配节点的位置。(它不可能是一片叶子。) 对于该位置,我使用以下方法创建树形图列表: public TreePath getPath(TreeNode node) { List<TreeNode> list = new ArrayList<TreeNode>(); while (node != null) {

我有JXTreeTable,可以对其进行筛选。过滤关键字时,将设置一个新模型。对我来说没问题

现在,我想展开所有过滤结果。为此,我保存了找到匹配节点的位置。(它不可能是一片叶子。)

对于该位置,我使用以下方法创建树形图列表:

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());
}
但它没有任何效果,只有根被扩展,所有的子对象都被折叠。 在树冠上,最后一个元素是没有叶子。在System.out中,在这个循环中,我得到了:

-一, 真的 真的 真的

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(树路径,树模型){
if(path.getPathCount()==0){
返回model.getRoot().equals(path.getPathComponent(0));
}
对于(int x=1;x
我知道这是一篇老文章,但在花了一个小时研究类似问题之后,我将把我的发现放在这里

方法“isPathValid”仅通过检查子(x)是否属于父(x-1)来验证序列是否正确,但不验证根是否与表模型相同(除非路径计数为零)

过滤时,通常会触发表模型的新根,因此如果在更新模型(并触发新根)之前捕获树路径,表将无法找到路径,尽管路径本身是有效的

它应该进行一些更改:

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);
}
public**List**getPath(树节点){
列表=新的ArrayList();
**while(node!=model.getRoot()){**
列表。添加(节点);
node=node.getParent();
}
收款。反向(列表);
**退货清单**
}
**对于(列表元素:f.gettreepath()){**
元素添加(0,model.getRoot());
expandPath(新树路径(elem.toArray());
tree.scrollPathToVisible(元素);
}
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;
}
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);
}