TableView中的JavaFX属性

TableView中的JavaFX属性,javafx,tableview,Javafx,Tableview,我正在自学如何在TableView中使用JavaFX属性,并且在某些属性类型上遇到了问题。我有一个对象Person,它包含两个属性 public class Person { private final StringProperty firstName; private final IntegerProperty age; public Person(String firstName, Integer age) { this.firstName = n

我正在自学如何在TableView中使用JavaFX属性,并且在某些属性类型上遇到了问题。我有一个对象Person,它包含两个属性

public class Person {

    private final StringProperty firstName;
    private final IntegerProperty age;

    public Person(String firstName, Integer age) {
        this.firstName = new SimpleStringProperty(firstName);
        this.age = new SimpleIntegerProperty(age);
    }


    public Integer getAge() {
        return age.get();
    }

    public void setAge(Integer age) {
        this.age.set(age);
    }

    public IntegerProperty ageProperty() {
        return age;
    }

    public String getFirstName() {
        return firstName.get();
    }

    public void setFirstName(String firstName) {
        this.firstName.set(firstName);
    }

    public StringProperty firstNameProperty() {
        return firstName;
    }

}
一旦由目标创建,则在TableView中使用此对象。我已经像这样创建了两个表列

TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age");
有人能解释一下ageColumn.setCellValueFactory(…)到底出了什么问题吗?任何帮助都将不胜感激


谢谢

属性API的一个有点奇怪的部分是
IntegerProperty
实现了
observeValue
,而不是
observeValue
。所以,有点违反直觉,你需要

TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
TableColumn ageColumn=新的TableColumn(“年龄”);

顺便说一句,我不确定这是否会导致问题,但对于模型类中get方法的返回类型和set方法的参数类型,通常使用
int
而不是
Integer
。它们与
IntegerProperty.get()
IntegerProperty.set(…)
的类型相匹配,因此它只是避免了一些隐式的自动(取消)装箱。

您可以使用.asObject方法使代码正常工作
不需要将TableColumn参数更改为Number

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
idk哪种代码更好,
将参数更改为数字或使用对象方法

对于字符串类型:

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
如果要使用
IntegerProperty
DoubleProperty
,则
setCellValueFactory(…)
必须有一个额外的
asObject()

这是必要的,因为JavaFX的设计决策很糟糕


如果您将其作为对象返回,它可能会打印toString方法,并将值作为字符串,我认为这是默认行为
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());