我正在教自己如何使用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(...)出了什么问题吗?任何帮助将不胜感激。
谢谢!
答案 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方法
答案 2 :(得分:0)
对于字符串类型:
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
当您要使用IntegerProperty
或DoubleProperty
时,setCellValueFactory(...)
必须还有asObject()
:
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
由于JavaFX的设计决策不好,这是必要的。