Как получить количество строк TreeTableView? - PullRequest
0 голосов
/ 05 апреля 2020

Редактировать : теперь я принимаю, что метод TreeTableView.getExpandedItemCount() фактически отображает все отображаемые TreeItem. Это делает этот метод одним из самых вопиюще плохо названных методов, с которыми мне когда-либо приходилось сталкиваться по неопровержимым причинам, изложенным в моем первоначальном вопросе и повторенным в нескольких комментариях.


Простой итератор дерева может быть разработан для подсчета всех элементов (независимо от того, показаны они или скрыты из-за того, что один или несколько предков свернуты) в столбце TreeTableView (столбце дерева).

Но я не могу найти способ подсчета строк, которые «отображаются». Я говорю «отображается», а не «видимый», потому что строка дерева может отображаться без необходимости быть видимой.

Я отмечаю, что существует метод TreeTableView.getExpandedItemCount(). Это не говорит вам о том, что я хочу знать: у вас может быть набор листьев, каждый из которых занимает один ряд, ни один из которых не расширен. В равной степени возможно, что эти расширенные элементы могут включать TreeItem s, один или несколько из которых на самом деле свернуты, и то, что расширение TreeItem не означает, что оно отображается.

Я также посмотрел на TreeTableColumn. Я не мог видеть ничего очень очевидного.

Единственное решение, которое я могу придумать, в высшей степени неэлегантное:

// NB TreeIterator is a simple depth-first stack-based iterator
TreeIterator iterator = new TreeIterator(treeTableView.getRoot());
int nRows = 0;
while (iterator.hasNext()) {
    TreeItem ti = iterator.next();
    int row = treeTableView.getRow( ti );
    if( row > nRows ) nRows = row;
}
log.debug( "displayed rows " + nRows );

... должно быть, безусловно, что-то лучше этого.

1 Ответ

2 голосов
/ 05 апреля 2020

Метод TreeTableView.getExpandedItemCount() дает количество отображаемых строк. Прежде чем было понято, что это простое решение было в продаже, были найдены альтернативные решения для получения той же вещи:

private static int getVisibleCellCount(TreeTableView<?> treeTableView) {
    TreeTableViewSkin<?> skin = (TreeTableViewSkin<?>) treeTableView.getSkin();
    Optional<VirtualFlow> vf = skin.getChildren().stream()
            .filter(child -> child instanceof VirtualFlow)
            .map(VirtualFlow.class::cast)
            .findFirst();
    if (vf.isPresent()) {
        VirtualFlow<?> virtualFlow = vf.get();
        IndexedCell first = virtualFlow.getFirstVisibleCell();
        if (first != null) {
            return virtualFlow.getCellCount();
        }
    }
    return 0;
}

ПРИМЕЧАНИЕ : Опять же, это не решение для реальная проблема. Решение показывает только, как получить первую и последнюю ячейку в окне просмотра.

...