12

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

在这种情况下,我们是否需要同时实现单元值工厂和单元工厂,或者任何一个就足够了?如果一个就足够了,那么哪一个?

谢谢

4

2 回答 2

31

直截了当,

单元格值工厂:它就像一个“toString()”,只是该相关单元格的行项目的一部分。
Cell Factory:它是来自单元格项目的单元格的渲染器。如果单元格项目不是 a Node,则默认行为是 setText(cell.item.toString()) ,否则为 setGraphic((Node)cell.item) 。如果单元格应该支持编辑,或者如果您想要除 default 之外的更多图形(控件),请设置此属性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>");
        }
    }
});
于 2012-05-10T10:26:26.813 回答
8

您也可以只修改数据对象的 getter 方法。在您的情况下,这是 Person 类,它包含 firstName、lastName 和(大概)前缀。

向 Person 类添加一个新方法:

public String getTotalName() {
  return this.prefix + " " + this.getLastName() + ", " + this.getFirstName();
}

然后只需应用 CellValueFactory:

totalNameCol.setCellValueFactory(
  new PropertyValueFactory<Person,String>("totalName")
);

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

于 2012-08-08T12:17:03.017 回答