如何获取 TreeTableView 的行数?

How to get the row count of a TreeTableView?

编辑:我现在接受 TreeTableView.getExpandedItemCount() 方法实际上似乎计算了所有 TreeItem当前显示。这使该方法成为我不幸遇到过的命名最糟糕的方法之一,原因在我最初的问题中已陈述无可辩驳,并在几条评论中得到重申。


可以设计一个简单的树迭代器来计算 TreeTableView 的 column0(树列)中的所有项目(无论是否显示,或由于一个或多个祖先被折叠而隐藏)。

但我找不到计算 "displayed" 行数的方法。我说 "displayed" 而不是 "visible" 因为树行可以显示而不必可见。

我注意到有一个方法 TreeTableView.getExpandedItemCount()。这并没有完全告诉您我想知道的内容:您可以有一组叶子,每个叶子占据一行,其中 none 是展开的。同样,这些展开的项目可能包括 TreeItem 的一个或多个其祖先实际上已折叠:仅仅因为 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 );

...肯定有比这更好的东西。

方法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;
}

注意:同样,这不是真正问题的解决方案。该解决方案仅显示如何获取视口中的第一个单元格和最后一个单元格。