我正在使用JavaFx 2.0和Java 7.问题是关于JavaFX中的表视图。
以下示例代码创建firstName列,并为其分配单元工厂和单元格值工厂。
Callback<TableColumn, TableCell> cellFactory =
new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
return new EditingCell();
} };
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person,String>("firstName")
);
firstNameCol.setCellFactory(cellFactory);
我的要求是我有一个列不直接映射到Person对象中的单个属性,而是通过连接Person对象的一个或多个属性创建的自定义值。
考虑一种情况,我有一个名为Full Name的表列,其值为Prefix + Last Name +“,”+ First Name。
1)在这种情况下,您将如何编写单元格值工厂?
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person,String>(???????)
);
2)你将如何写细胞工厂?
在这种情况下,我们是否需要实现单元值工厂和单元工厂,还是任何一个都足够了?如果一个就足够了吗?
由于
答案 0 :(得分:24)
直截了当,
Cell Value Factory:它就像只是该相关单元格的部分行项目的“toString()”。
Cell Factory:它是来自单元格项目的单元格的渲染器。如果单元格项不是Node
,setGraphic((Node)cell.item),则默认行为是setText(cell.item.toString())。如果单元格应支持编辑,则设置此属性;如果需要除默认Label
以外的更多图形(控件),则设置此属性。
因此,对于您的方案,将单元格工厂保留为默认值就足够了(2)。以下是(1)的示例代码:
firstAndLastNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Person, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Person, String> p) {
if (p.getValue() != null) {
return new SimpleStringProperty(p.getValue().getPrefix() + " " + p.getValue().getFirstName() + "," + p.getValue().getLastName());
} else {
return new SimpleStringProperty("<no name>");
}
}
});
答案 1 :(得分:7)
您也可以只修改数据对象的getter方法。在你的情况下,这是类Person,它包含firstName,lastName和(推测)前缀。
向Person类添加一个新方法:
public String getTotalName() {
return this.prefix + " " + this.getLastName() + ", " + this.getFirstName();
}
然后只应用CellValueFactory:
totalNameCol.setCellValueFactory(
new PropertyValueFactory<Person,String>("totalName")
);
我发现这比使用回调更舒服。