今天,我在尝试了解有关 JavaFX 和 Java 的更多信息时遇到了另一件我不太了解的事情。
引用以下教程(我试图将原理应用于组织者):
我将简要概述我有问题的特定部分:
我的主窗口包含一个显示一些约会数据的表格 View 。 所以我得到了一些这种风格的线条(与教程中的相同):
aColumn.setCellValueFactory(cellData ->cellData.getValue().getAColumnsProperty());
可以通过附加的 EditDialog 操作数据。 那很好用。如果我编辑内容,更改会立即显示,但我做了一些额外的研究以更好地理解 Lambda(不太成功)。现在...在在线 java 文档中 Java Doc PropertyValueFactory它说: “回调接口(interface)的便捷实现,[...]”
所以我将我的代码重构为这种风格:
aColumn.setCellValueFactory(new PropertyValueFactory<Appointment,LocalDate>("date"));
我发现它比 Lambda 更具可读性。 但我注意到,当我进行更改时,我需要在显示更改之前对 TableView 进行一些排序。
是否可以通过第二种方式实现变化的即时显示?
如果是:是否存在阻碍此类修改的主要缺点? IE。在这种情况下,Lambda 会是最佳实践吗?
感谢任何帮助。
最佳答案
PropertyValueFactory
期望正确命名的属性 getter 。 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()
, 但在更新 Cell
之前,模型中的这种情况更新在 UI 中是不可见的, 自 PropertyValueFactory
“不知道”在哪里添加监听器。
PropertyValueFactory
的缺点
- 只能找到
public
public
中的方法类 -
PropertyValueFactory
使用反射 - 不是类型安全的。在
new PropertyValueFactory<Appointment, LocalDate>("date")
编译器不会检查,如果有一个合适的方法,如果该方法甚至返回一个合适的类,或者如果属性 getter 返回String
而不是ReadOnlyProperty<LocalDate>
这可能导致ClassCastException
s. - 没有编译时检查。在 lambda 表达式中,编译器可以检查该方法是否存在并返回适当的类型;与
PropertyValueFactory
这还没有完成。 - 不适用于 records .
如果你确定在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());
}
});
关于Java: setCellValuefactory; Lambda 与 PropertyValueFactory;优点缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38049734/