TableView中的JavaFX属性

时间:2014-07-22 14:07:41

标签: 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;
    }

}

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

TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age");

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:60)

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

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

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

答案 1 :(得分:8)

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

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

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

related Link

答案 2 :(得分:0)

对于字符串类型:

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

当您要使用IntegerPropertyDoubleProperty时,setCellValueFactory(...) 必须还有asObject()

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

由于JavaFX的设计决策不好,这是必要的。

Source and credits

相关问题