Edit
:我现在接受方法TreeTableView.getExpandedItemCount()
实际上是在计算当前显示的所有TreeItem
。这使得这个方法成为我遇到过的最糟糕的命名方法之一,原因毋庸置疑,我在最初的问题中已经说过,并在几条评论中重申了这一点。
可以设计一个简单的树迭代器来计算TreeTableView
的列0(树列(中的所有项目(无论是显示的,还是由于一个或多个祖先被折叠而隐藏的(。
但我找不到一种计算"显示"行数的方法。我说"显示"而不是"可见",因为树行可以显示,而不一定是可见的。
我注意到有一个方法TreeTableView.getExpandedItemCount()
。这并没有告诉你我想知道的:你可以有一组叶子,每片叶子占一行,没有一片是展开的。同样,这些展开的项目可能包括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;
}
注意:同样,这不是真正问题的解决方案。该解决方案仅显示如何获取视口中的第一个单元格和最后一个单元格。