今天,在尝试学习有关JavaFX和Java的更多信息时,我遇到了我不太了解的另一件事。
引用是以下教程(旨在将原理应用到组织者):
JavaFX 8 Tutorial
我将简短地概述我遇到问题的特定部分:
我的主窗口包含一个显示一些约会数据的表格 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
可能会导致PropertyValueFactory
。 PropertyValueFactory
则无法完成。 如果您确定正确地在item类中实现适当的方法,则使用
Callback
没什么错,但是如上所述,它具有缺点。此外,实现ojit_code更加灵活。您可以例如进行一些其他修改: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());
}
});