如何正确使用PropertyValueFactory?

时间:2013-05-04 18:53:05

标签: java javafx-2 tableview

我正在尝试使用TableView创建一个表,并根据User对象列表以编程方式填充它。 User有三个变量,nameProperty(字符串),rankProperty(Enum称为Rank)和netMeritsProperty(int)。这些都存储在SimpleStringProperty个对象中。我的问题是数据不会出现在实际的表中,如下所示:

这是我的表格代码。我不理解的是什么?

TableColumn<User, String> name = new TableColumn<>("Name");
name.setCellValueFactory(new PropertyValueFactory<User, String>("nameProperty"));

TableColumn<User, String> rank = new TableColumn<>("Rank");
rank.setCellValueFactory(new PropertyValueFactory<User, String>("rankProperty"));

TableColumn<User, String> netMerits = new TableColumn<>("Net Merits");
netMerits.setCellValueFactory(new PropertyValueFactory<User, String>("netMeritsProperty"));

userTable.getColumns().addAll(name, rank, netMerits);

2 个答案:

答案 0 :(得分:15)

答案是关注注意事项,您提供的字符串内容是PropertyValueFactory的参数,以及哪些方法是在封装数据类型中实现的。

实例化:

new PropertyValueFactory<User, String>("name")

将查找:

User.nameProperty()

答案 1 :(得分:13)

使用PropertyValueFactory很简单,但并非万无一失。

使用PropertyValueFactory可能最麻烦的一点是,您提供的参数必须符合STRICT约定的JavaFX Bean属性名称:

  1. 您不得包含“Property”一词
  2. 匹配区分大小写,因此“FIRSTNAME”不会被识别为“firstName”
  3. 最好的方法是查看JavaFX Bean定义块,找到属性行。获取属性的名称,省略“属性”部分,并将其完全复制(在相同的情况下)到传递给PropertyValueFactory的字符串。

    例如,假设你有这个JavaFX Bean定义:

    public final String getFirstName() { return this.m_firstname.get(); }
    public final void setFirstName(String v) { this.m_firstname.set(v); }
    public final StringProperty firstNameProperty() { return m_firstname; }
    

    查看最后一行中属性的名称“firstNameProperty”。省略“Property”,结果字符串是必须使用-exactly-作为PropertyValueFactory的String参数,例如。 “名字”。

    tcolMyTableCol.setCellValueFactory(new PropertyValueFactory("firstName"));