У меня была такая же проблема, и из-за свойства 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));
}
}
Это может выглядеть как взлом, но работает как шарм.
person
user645859
schedule
08.10.2014