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 が問題なのでしょうか?

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

1 に答える 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 に答える