如何执行此操作的具体细节取决于您的需求:例如,对于给定的 RelationManager 对象,与其关联的 User、Patient 或 Responsible 对象是否会发生变化?您需要该表可编辑吗?
但基本思想是表中的每一行代表一些RelationManager,所以表类型是TableView<RelationManager>
。每列显示某种类型的值(称之为S
),所以每一列都是类型TableColumn<RelationManager, S>
, where S
从一列到下一列可能有所不同。
单元格值工厂是一个对象,指定如何从RelationManager
对象为类型的可观察值S
。执行此操作的确切方法取决于模型类的设置方式。
如果与给定关联的各个对象RelationManager
永远不会改变(例如Patient
对于给定的RelationManager
总是相同的),那么就非常简单了。假设您有通常的设置Patient
:
public class Patient {
private StringProperty firstName = new SimpleStringProperty(...);
public StringProperty firstNameProperty() {
return firstName ;
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String firstName) {
this.firstName.set(firstName);
}
// etc etc
}
那么你就可以做
TableColumn<RelationManager, String> firstNameColumn = new TableColumn<>("First Name");
firstNameColumn.setCellValueFactory(new Callback<CellDataFeatures<RelationManager,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<RelationManager, String> data) {
return data.getValue() // the RelationManager
.getPatient().firstNameProperty();
}
});
如果您不使用 JavaFX 属性,则可以使用与PropertyValueFactory
用途,即:
TableColumn<RelationManager, String> firstNameColumn = new TableColumn<>("First Name");
firstNameColumn.setCellValueFactory(new Callback<CellDataFeatures<RelationManager,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<RelationManager, String> data) {
return new ReadOnlyStringWrapper(data.getValue().getPatient().getFirstName());
}
});
但请注意,如果您在表外部更改患者姓名,则此信息不会更新。
但是,如果与关系管理器关联的患者对象发生更改,则所有这些都不起作用(单元格仍会观察到错误的信息)firstNameProperty()
)。在这种情况下,您需要一个可观察值,该值在“中间”患者属性或firstNameProperty 更改时发生更改。 JavaFX 有一个BindingsAPI 与一些select(...)
可以做到这一点的方法:不幸的是,在 JavaFX 8 中,如果沿途任何对象为空,它们会向控制台发出大量警告,它们将在TableView
语境。在这种情况下,我建议查看EasyBind框架,它允许你做类似的事情
firstNameColumn.setCellValueFactory( data ->
EasyBind.select(data.getValue().patientProperty())
.selectObject(Patient::firstNameProperty));
(EasyBind 需要 JavaFX 8,因此如果您要使用它,您还可以使用 lambda 表达式和方法引用:)。)
在任何一种情况下,如果您希望表格可编辑,则在将编辑提交返回到设置属性的适当调用方面,需要对可编辑单元格做一些额外的工作。