小编典典
PropertyValueFactory需要正确命名的属性获取器。getAColumnsProperty可能不是一个。
在的情况下new PropertyValueFactory
LocalDate>("date")的Appointment类需要包含一个dateProperty()方法;
返回的值需要扩展ReadOnlyProperty才能正常工作,并且如果返回的对象也是,则任何编辑只会自动导致模型中的更新WritableValue。
Appointment应使用的示例类PropertyValueFactory<>("date"):
public class Appointment {
private final ObjectProperty date = new SimpleObjectProperty<>();
public final LocalDate getDate() {
return this.date.get();
}
public final void setDate(LocalDate value) {
this.date.set(value);
}
public final ObjectProperty dateProperty() {
return this.date;
}
}
如果不存在这样的方法,PropertyValueFactory则将使用getter来获取值,即getDate(),但是这种情况下,直到更新,在UI中才能看到模型中的更新Cell,因为PropertyValueFactory“不知道”在何处添加侦听器。
缺点 PropertyValueFactory
只能public在public类中找到方法
PropertyValueFactory 使用反射
不是类型安全的。在new PropertyValueFactory("date")编译器中不检查是否有合适的方法,该方法是否返回合适的类,或者例如属性getter返回a String而不是ReadOnlyProperty可以导致ClassCastExceptions的a。
没有编译时间检查。在lambda表达式中,编译器可以检查该方法是否存在并返回适当的类型。有PropertyValueFactory没有这样做。
如果您确定正确地在item类中实现适当的方法,则使用不会有任何问题PropertyValueFactory,但是如上所述,它有其缺点。此外,实施Callback更加灵活。您可以例如进行一些其他修改:
TableColumn column = ...
column.setCellValueFactory(new Callback, ObservableValue> {
@Override
public ObservableValue call(TableColumn.CellDataFeatures cd) {
Appointment a = cd.getValue();
return Bindings.createStringBinding(() -> "the year: " + a.getDate().getYear(), a.dateProperty());
}
});
2020-09-28