[英]JavaFX: what to do if you need to use a PropertyValueFactory
在我的表格中,我有一个单元格在不与表格交互的情况下不会更新。
我已经在这里找到了原因Java: setCellValuefactory; Lambda 与 PropertyValueFactory; 优点缺点
我的问题是,单元格项目的默认值是LocalDate.MIN
并且我希望我的单元格包含“---”,只要该项目具有此默认值。 当我更新项目时,我希望单元格包含当前日期字符串。
项目 Class:
public class ItemEv {
private final ObjectProperty<LocalDate> openedAt;
@XmlJavaTypeAdapter(LocalDateAdapter.class)
public final LocalDate getOpenedAt() {
return openedAt.get();
}
public final ObjectProperty<LocalDate> openedAtProperty() {
return this.openedAt;
}
public final void setOpenedAt(LocalDate openedAt) {
this.openedAt.set(openedAt);
}
}
在我的 CellFactory 中,我设置了新值: i.setOpenedAt(LocalDate.now());
这是有效但不想要的:
openedAtColumnEv.setCellValueFactory(cellData -> cellData.getValue().openedAtProperty().asString());
这就是我到目前为止所尝试的:
openedAtColumnEv.setCellValueFactory(new Callback<CellDataFeatures<ItemEv, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ItemEv, String> i) {
if (i.getValue().getOpenedAt().equals(LocalDate.MIN)) {
return new SimpleStringProperty("---");
}
return i.getValue().openedAtProperty().asString();
}
});
和这个:
openedAtColumnEv.setCellValueFactory(cellData -> {
if(cellData.getValue().openedAtProperty().getValue().equals(LocalDate.MIN)) {
return new SimpleStringProperty("---");
}
return cellData.getValue().openedAtProperty().asString();
});
我的两个测试都返回SimpleStringProperty
或StringBinding
应该没问题。
在我的测试中,我犯了一个错误,即 IF 语句中的第一个 return 永远不会返回 true,然后单元格值显示 LocalDate.MIN 的标准字符串,并在 item 属性更改时立即更新。
我对此有点迷茫。 请原谅我的英语不好,我不是母语人士。
如果 model class 中的属性是ObjectProperty<LocalDate>
,那么该列应该是TableColumn<ItemEv, LocalDate>
,而不是TableColumn<ItemEv, String>
。
直接实现cellValueFactory
(通常使用 lambda 表达式)总是优于使用旧的PropertyValueFactory
class。 您永远“不需要”使用PropertyValueFactory
(也永远不应该)。
cellValueFactory
仅用于确定要显示的数据。 它不用于确定如何显示数据。 对于后者,您应该使用cellFactory
。
所以:
private TableColumn<ItemEv, LocalDate> opendAtColumnEv ;
// ...
openedAtColumnEv.setCellValueFactory(cellData -> cellData.getValue().openedAtProperty());
openedAtColumnEv.setCellFactory(column -> new TableCell<>() {
@Override
protected void updateItem(LocalDate openedAt, boolean empty) {
super.updateItem(openedAt, empty);
if (openedAt == null || empty) {
setText("");
} else {
if (openedAt.equals(LocalDate.MIN())) {
setText("---");
} else {
// Note you can use a different DateTimeFormatter as needed
setText(openedAt.format(DateTimeFormatter.ISO_LOCAL_DATE));
}
}
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.