JavaFX:如果需要使用 PropertyValueFactory 该怎么办
JavaFX: what to do if you need to use a PropertyValueFactory
在我的 table 中,我有一个单元格在没有与 table 交互的情况下不会更新。
我已经找到原因了
我的问题是,单元格项目的默认值为 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();
});
我的两个测试 return SimpleStringProperty
或 StringBinding
都应该没问题。
在我的测试中我犯了一个错误,IF 语句中的第一个 return 永远不会 return 为真,然后单元格值显示 LocalDate.MIN 的标准字符串并得到更新当项目 属性 更改时立即。
我对此有点迷茫。请原谅我的英语不好,我不是母语人士。
如果模型 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<ItemEv, LocalDate>() {
@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));
}
}
}
});
在我的 table 中,我有一个单元格在没有与 table 交互的情况下不会更新。
我已经找到原因了
我的问题是,单元格项目的默认值为 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();
});
我的两个测试 return SimpleStringProperty
或 StringBinding
都应该没问题。
在我的测试中我犯了一个错误,IF 语句中的第一个 return 永远不会 return 为真,然后单元格值显示 LocalDate.MIN 的标准字符串并得到更新当项目 属性 更改时立即。
我对此有点迷茫。请原谅我的英语不好,我不是母语人士。
如果模型 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<ItemEv, LocalDate>() {
@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));
}
}
}
});