我有一个名为 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");
}
}
};
});
}
});
表视图将在用户滚动时重用单元格,并在单元格重新用于新项目时自动调用单元格上的updateItem
。因此,您应该只设置一次单元工厂,然后让表视图负责完成它设计要执行的工作。如果您使用的是 FXML,则可以在 initialize()
方法中设置单元工厂,或者只需在创建表和列的任何位置设置单元工厂。
您的单元格实现并不完全正确:因为一个单元格可以重复使用以任意显示任何两个不同的项目,因此您需要考虑所有可能的条件。在您的实现中,如果单元格显示item.intValue()==0
的项目,然后重用以显示item.intValue() != 0
的项目,则样式将无法正确更新。
另请注意,您应该通过调用 intValue()
将Number
"转换"为int
。
TableColumn<VerreFX, Number> stock ;
// ...
stock.setCellFactory(column -> 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 (item.intValue() == 0 && st.getVerresBOX()) {
currentRow.setStyle("-fx-background-color:lightcoral");
} else {
currentRow.setStyle(tableVerre.getStyle());
}
}
}
});
您应该能够完全删除滚动事件处理程序。
除了使用CPU时间之外,您并没有涵盖所有滚动情况,因为如果用户使用键向下/向上或使用滚动条滚动,则不会触发滚动事件。所以你必须再添加两个EventFilter
,第一个将使用滚动条处理滚动。
tableVerre.addEventFilter(MouseEvent.MOUSE_CLICKED,(
MouseEvent event)->
{
if ((event.getTarget() instanceof TableColumnHeader) | event.isDragDetect()) {
System.err.println("Mouse Draged : " + event.toString());
stock.setCellFactory((TableColumn<VerreFX, Number> 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");
}
}
}
};
});
}
});
第二个将使用键盘键向下/向上处理滚动。
tableVerre.addEventFilter(KeyEvent.KEY_PRESSED,new EventHandler<KeyEvent>(){
@Override
public void handle(KeyEvent event) {
if (event.getCode() == KeyCode.DOWN | event.getCode() == KeyCode.UP) {
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");
}
}
}
};
});
}
System.err.println("Key Pressed : " + event.toString());
}
});