javafx的细胞工厂

时间:2012-05-09 15:48:00

标签: tableview javafx

我正在使用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)你将如何写细胞工厂?

在这种情况下,我们是否需要实现单元值工厂和单元工厂,还是任何一个都足够了?如果一个就足够了吗?

由于

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")
);

我发现这比使用回调更舒服。