首页 文章

TableView中的JavaFX属性

提问于
浏览
25

我正在教自己如何使用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");

然后我想使用Lambda表达式设置单元格值工厂 . 这就是出现问题的地方 . StringProperty firstName工作得很好 . 但是,IntegerProperty给出了错误消息 "Type mismatch: cannot convert from IntegerProperty to ObservableValue<Integer>"

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty());

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

谢谢!

3 回答

  • 0

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

    TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
    

    顺便说一下,对于get方法的返回类型和模型类中set方法的参数类型,我更常用 int 而不是 Integer . 这些匹配 IntegerProperty.get()IntegerProperty.set(...) 的类型,因此它只是避免了一些隐式的自动(联合)装箱 .

  • 58

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

    ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
    

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

    related Link

  • 8

    对于String类型:

    firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
    

    如果要使用 IntegerPropertyDoublePropertysetCellValueFactory(...) must 还有 asObject()

    ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
    

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

    Source and credits

相关问题