int (final @NotNull JTree tree) { final Rectangle visible = tree.getVisibleRect(); if (visible == null) return 0; int rowCount = tree.getRowCount(); if (rowCount <= 0) return 0; int firstRow; int lastRow; int rowHeight = tree.getRowHeight(); if (rowHeight > 0) { Insets insets = tree.getInsets(); int top = visible.y - insets.top; int bottom = visible.y + visible.height - insets.top; firstRow = Math.max(0, Math.min(top / rowHeight, rowCount - 1)); lastRow = Math.max(0, Math.min(bottom / rowHeight, rowCount - 1)); } else { firstRow = tree.getClosestRowForLocation(visible.x, visible.y); lastRow = tree.getClosestRowForLocation(visible.x, visible.y + visible.height); } return lastRow - firstRow + 1; }