javafx的细胞工厂

use*_*356 9 javafx tableview

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

我的要求是我有一个列不直接映射到Person对象中的单个属性,而是通过连接Person对象的一个​​或多个属性创建的自定义值.

考虑一种情况,我有一个名为Full Name的表列,其值为Prefix + Last Name +","+ First Name.

1)在这种情况下,您将如何编写单元格值工厂?

firstNameCol.setCellValueFactory(
            new PropertyValueFactory<Person,String>(???????)
        );
Run Code Online (Sandbox Code Playgroud)

2)你怎么写细胞工厂?

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

谢谢

Ulu*_*Biy 27

直截了当,

单元格值工厂:它类似于"相关单元格的行项目的一部分"的"toString()".
Cell Factory:它是来自单元项的单元格的渲染器.如果单元格项不是a NodesetGeraphic((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>");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)


Pet*_*ich 6

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

向Person类添加一个新方法:

public String getTotalName() {
  return this.prefix + " " + this.getLastName() + ", " + this.getFirstName();
}
Run Code Online (Sandbox Code Playgroud)

然后只应用CellValueFactory:

totalNameCol.setCellValueFactory(
  new PropertyValueFactory<Person,String>("totalName")
);
Run Code Online (Sandbox Code Playgroud)

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

  • 我不喜欢这种方法.很明显,如果有人重命名变量`totalName`会发生什么.代码将不再起作用,编译器无法告诉您. (2认同)