У меня есть 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() — это список TreePath, который я создал с помощью метода ранее.
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));
Возможно, проблема в -1 для getRowForPath?
естьПутьВалид():
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;
}