【问题标题】:Java(fx) - TableView - Did I understood the usage of setCellValueFactory and PropertyValueFactory?Java(fx) - TableView - 我了解 setCellValueFactory 和 PropertyValueFactory 的用法吗?
【发布时间】:2017-07-19 11:04:11
【问题描述】:

来自 eclipse 帮助:

setCellValueFactory

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


CellDataFeatures

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


PropertyValueFactory

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


用我的话解释:

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

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

我了解setCellValueFactoryPropertyValueFactory 的用法吗?

【问题讨论】:

  • 传递给PropertyValueFactory构造函数的值与具有该属性的变量的名称无关:它链接到用于访问该属性的方法名称和它的价值。请参阅documentation
  • 我没有得到你答案的第二部分,对不起。如果传递给构造函数的值与我的变量的名称无关,那么我希望我必须有一个名为 nameProperty 的方法,就像文档说的那样:在这个例子中,使用了“firstName”字符串作为对 Person 类类型中假定的 firstNameProperty() 方法的引用,但我没有。您能否尝试给我一个提示,说明您指向我的文档的哪个特殊部分?提前致谢。
  • 这就是我的意思。如果变量的名称是fname ,但方法是firstNameProperty,则需要new PropertyValueFactory("firstName")不是 new PropertyValue("fname")
  • FWIW 我强烈建议不要使用PropertyValueFactory,而只是自己实现回调,就像@ievinm 的回答一样。
  • 我坚持这样一个事实,即我没有像firstNameProperty 这样的方法。但是按照文档 如果不存在与此模式匹配的方法,则支持尝试调用 get() 或 is() 我得到了这个。我的 getter 被称为 getFirstName,如果我重命名它们,那么我会得到预期的行为,即该列不显示任何值。谢谢楼主!

标签: java javafx


【解决方案1】:

是的,那是正确的。另请注意,表的数据需要使用以下内容进行设置:

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

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

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

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

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

【讨论】:

  • 有什么理由我应该使用 lambda 而不是 PropertyValueFactory 或其他(如@James_D 建议)?
  • 总的来说,如果 PropertyValueFactory 实现正确,并且在 MyModelClass 中使用正确命名的方法,那么它没有任何错误,但它也有其缺点;其中,直到运行时才真正检查是否返回了正确的类型。使用 lambda,编译器可以首先检查方法是否存在,以及是否返回了正确的类型。 This link here goes into more detail about it.
【解决方案2】:

我不知道您是否了解它的使用方式;描述似乎大部分是正确的,但有些细节您没有正确:

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

  • PropertyValueFactory 不查找该字段。它查找用于检索ObservableValuenameProperty() 方法。
    如果没有这样的方法,它会寻找一个 getter 方法:getName()isName()。在后一种情况下,使用包装了 getter 返回值的 ObservableValue 实例(请注意,这使得自动更新变得不可能)。

【讨论】:

  • 对我来说,您的第一点似乎是对它们如何协同工作的简单理解解释。
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 2016-08-28
  • 2018-04-21
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
相关资源
最近更新 更多