フィルタリングできる 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;
}