我有一个名为TableView
的{{1}},我想让它的每一行检查一个条件(tableVerre
列值)并在滚动时对它们执行一些代码,所以我写了这段代码,但是它会让程序耗费大量的CPU时间,我不熟悉Lambda表达式,所以有更简单的方法来编写吗? :
stock
答案 0 :(得分:2)
表格视图将在用户滚动时重复使用单元格,并在重新用于新项目时自动调用单元格上的updateItem
。所以你应该只设置一次单元工厂,然后让表视图负责完成它的设计工作。如果您使用的是FXML,可以在initialize()
方法中设置单元格工厂,或者只在您创建表格和列的位置设置单元格工厂。
您的单元格实现并不完全正确:因为可以重复使用单元格来任意显示任意两个不同的项目,您需要考虑所有可能的条件。在您的实现中,如果单元格显示item.intValue()==0
的项目,然后重新使用该项目以显示item.intValue() != 0
的项目,则该样式将无法正确更新。
另请注意,您应该"转换"通过致电Number
,int
到intValue()
。
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());
}
}
}
});
您应该能够完全删除滚动事件处理程序。
答案 1 :(得分:1)
首先,除了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());
}
});