TableView中的JavaFX属性

Mat*_*rry 28 javafx tableview

我正在教自己如何在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;
    }

}
Run Code Online (Sandbox Code Playgroud)

一旦按目标创建,就是在TableView中使用此对象.我已经创建了这样的两个表列.

TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age");
Run Code Online (Sandbox Code Playgroud)

然后我想使用Lambda表达式设置单元格值工厂.这就是出现问题的地方.StringProperty firstName工作得很好.但是,IntegerProperty给出了错误消息"类型不匹配:无法转换IntegerPropertyObservableValue<Integer>"

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty());
Run Code Online (Sandbox Code Playgroud)

任何人都可以了解ageColumn.setCellValueFactory(...)出了什么问题?任何帮助将不胜感激.

谢谢!

Jam*_*s_D 64

属性API的一个有点奇怪的部分是IntegerProperty实现ObservableValue<Number>,而不是ObservableValue<Integer>.所以,有点违反直觉,你需要

TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我不知道这是否会导致问题,但它是更常见的使用int,而不是Integer返回类型为get方法和模型中的类集合方法的参数类型.这些匹配类型IntegerProperty.get()IntegerProperty.set(...),所以它只是避免了一些隐含的汽车(UN)拳击.


bun*_*cis 8

您可以使用.asObject方法使您的代码工作,
它不需要您将TableColumn Paramater更改为Number

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
Run Code Online (Sandbox Code Playgroud)

idk哪一个是更好的代码,
将参数更改为Number或使用asObject方法

相关链接