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


