, - TableView factory , , , TableView.setItems() , IMO, factory , .
factory:
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");
}
};
return cell;
}
}
, ( ) . , TableRow factory .
However, this extra row will not be visible when scrolling down, because the TableView scrolling implementation does not know the extra row and will only scroll to the last row from the list of items at the bottom of the view window. This can be solved by overriding the TableViewSkin.getItemCount () method, as in the following example. An override of TableView is not required in itself, but is recommended if such a table is used frequently.
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));
}
}
It may look like a hack, but it works like a charm.
source
share