我有同样的问题,而且由于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));
}
}
这可能看起来像一个黑客,但像一个魅力。
谢谢 - 如果表中有10行(0到9),第9行是总数,我希望能够对0到8行进行排序,并总是在第9行... – assylias 2012-03-14 10:27:59
嗯,你可以将自己的类型放在列中,并将最后一行的子类放在比较器中,检查该类的instanceof,如果是,则返回1(-1)。你必须处理你的对象类型的ColumnFormatters才能很好地显示它。 – darijan 2012-03-14 13:54:52
这确实有用 - 如果我找不到更清洁的东西,我会牢记它... – assylias 2012-03-14 14:00:26