我正在教自己如何使用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 回答
属性API的一个有点奇怪的部分是
IntegerProperty
实现ObservableValue<Number>
,而不是ObservableValue<Integer>
. 所以,有点违反直觉,你需要顺便说一下,对于get方法的返回类型和模型类中set方法的参数类型,我更常用
int
而不是Integer
. 这些匹配IntegerProperty.get()
和IntegerProperty.set(...)
的类型,因此它只是避免了一些隐式的自动(联合)装箱 .您可以使用.asObject方法使代码工作
它不需要您将TableColumn Paramater更改为Number
idk哪一个是更好的代码,
将参数更改为Number或使用asObject方法
related Link
对于String类型:
如果要使用
IntegerProperty
或DoubleProperty
,setCellValueFactory(...)
must 还有asObject()
:这是必要的,因为JavaFX的设计决策很糟糕 .
Source and credits