JXTreeTable expandPath после фильтрации

У меня есть 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;
}

person janor    schedule 29.04.2014    source источник


Ответы (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);
}
person Itamar Vieira Junior    schedule 05.04.2017