У меня была та же проблема, и из-за свойства TableView вызывать фабрику ячеек для стольких строк, сколько видно в таблице, а не только для индексов строк вплоть до размера списка, установленного методом TableView.setItems (), IMO, лучше установить итоговое значение непосредственно по фабрике ячеек для каждого столбца, который должен иметь его.
Вот простой пример такого класса фабрики ячеек:
public class LocalDateTableCell<T> implements
Callback<TableColumn<T, LocalDate>, TableCell<T, LocalDate>> {
@Override
public TableCell<T, LocalDate> call(TableColumn<T, LocalDate> p) {
TableCell<T, LocalDate> cell = new TableCell<T, LocalDate>() {
@Override
protected void updateItem(LocalDate item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
} else {
setText(DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
.format(item));
}
if (getTableView().getItems().size() == getIndex())
setText("Test"); // This shows in the summary row
}
};
return cell;
}
}
Преимущества этого подхода состоят в том, что такая строка вообще не участвует в сортировке (поскольку ее нет в списке элементов таблицы) и также не может быть выбрана. Кроме того, с помощью переопределения фабрики TableRow легко установить другой цвет фона для всей строки сводки и отличить его от других строк.
Однако эта дополнительная строка не будет видна при прокрутке вниз, потому что реализация прокрутки TableView не знает для дополнительной строки и будет прокручивать только до последней строки из списка элементов в нижней части области просмотра. Это можно решить путем переопределения метода TableViewSkin.getItemCount (), как в следующем примере. Переопределение самого TableView не обязательно, но рекомендуется, если такая таблица используется часто.
public class MyTableViewSkin<T> extends TableViewSkin<T> {
private TableView<T> tableView;
public MyTableViewSkin(final TableView<T> tableView) {
super(tableView);
this.tableView = tableView;
}
@Override
public int getItemCount() {
return tableView.getItems() == null || tableView.getItems().size() == 0 ?
0 : tableView.getItems().size() + 1;
}
}
public class MyTableView<S> extends TableView<S> {
public MyTableView() {
super();
setSkin(new MyTableViewSkin<>(this));
}
}
Это может выглядеть как хак, но работает как шарм.