Java(fx) - TableView - 我是否理解了setCellValueFactory和PropertyValueFactory的用法?

时间:2017-02-28 12:58:22

标签: java javafx

来自日食帮助:

setCellValueFactory

需要将单元格值工厂设置为指定如何填充单个TableColumn 中的所有单元格。单元格值工厂是一个回调,它提供 CellDataFeatures 实例,并期望返回一个ObservableValue。将在内部观察返回的ObservableValue实例,以允许立即更新值以反映在屏幕上。

<小时/> CellDataFeatures

TableColumn中使用的支持类作为的包装类,为特定的Cell提供所有必要的信息

<小时/> 的 PropertyValueFactory

创建一个默认的PropertyValueFactory,以从给定的TableView行项中提取值,反过来,使用给定的属性名称。

<小时/> 用我的话解释:

myTableViewColumn.setCellValueFactory(new PropertyValueFactory<MyModelClass, String>("name"));

setCellValueFactory 指定如何填充 myTableViewColumn 列中的所有单元格。此处使用的数据类型是属性。通过使用PropertyValueFactory,我们通过查找名为“name”的属性(在MyModelClass private final SimpleStringProperty name = new SimpleStringProperty("");中声明)来获取指定的属性。

我是否了解setCellValueFactoryPropertyValueFactory的使用情况?

2 个答案:

答案 0 :(得分:1)

是的,这是正确的。还要注意,表格的数据需要设置如下:

ObservableList<MyModelClass> tableData= FXCollections.observableArrayList();
table.setItems(tableData);

基本上,此表有一个MyModelClass对象列表。调用单元工厂将所需的字段从对象绑定到给定列中的单元格。

setCellValueFactory也可以与lambda而不是PropertyValueFactory一起使用,如下所示。

myTableViewColumn.setCellValueFactory(cellData -> cellData.getValue().name);

两者都做同样的事情,将对象列表中名称字段的值绑定到该列。

答案 1 :(得分:1)

我不知道你是否理解它是如何使用的;描述似乎大多是正确的,但有一些细节你没有得到正确的答案:

  • Callback本身不提供值。 cellValueFactory是一个Callback,它将CellDataFeatures个实例作为其方法的参数并返回ObservableValue;存储在ObservableValue实例中的值用作item的{​​{1}} 此外,该值仅传递给负责显示值的TableCell。这个单元格对新值的作用完全取决于它的实现者。屏幕上可能会显示更改,也可能不会显示更改,并且更改值时不需要在屏幕上显示单元格(可以使用TableCell滚动条将其滚动到视图之外)。

  • TableView不会查找该字段。它会查找用于检索PropertyValueFactory的{​​{1}}方法 如果没有此类方法,则会查找getter方法:nameProperty()ObservableValue。在后一种情况下,使用包装getter返回的值的getName()实例(;请注意,这使得无法自动更新)。