【发布时间】:2017-03-26 20:27:44
【问题描述】:
我有一个名为tableVerre 的TableView,我想让它的每一行都检查一个标准(stock 列值)并在滚动时对其执行一些代码,所以我编写了这段代码,但它使该程序消耗大量 CPU 时间,我不熟悉 Lambda 表达式,所以有没有更简单的方法来编写它? :
tableVerre.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent scrollEvent) {
stock.setCellFactory(column -> {
return new TableCell<VerreFX, Number>() {
@Override
protected void updateItem(Number item, boolean empty) {
super.updateItem(item, empty);
TableRow<VerreFX> currentRow = getTableRow();
if (empty || item == null) {
setText("");
setGraphic(null);
currentRow.setStyle(tableVerre.getStyle());
} else {
setText(getItem().toString());
}
if (!isEmpty()) {
if ((int) item == 0 && st.getVerresBOX()) currentRow.setStyle("-fx-background-color:lightcoral");
}
}
};
});
}
});
【问题讨论】:
-
为什么要替换滚动处理程序中的
cellFactory?除非您调整表格的大小,否则可能甚至不会重新创建单元格... -
我会把它放在哪里?顺便说一下,在不调整表格大小的情况下重新创建单元格。
-
如果您设置新的单元工厂 (AFAIK),将重新创建单元。如果您不不断地替换单元工厂,它们将在用户滚动时简单地重复使用(将在现有单元上调用
updateItem(...)方法)。显然,简单地调用updateItem()比重复替换所有单元格的性能要低得多。
标签: events javafx scroll event-handling tableview