我正在教自己如何在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给出了错误消息"类型不匹配:无法转换IntegerProperty
为ObservableValue<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)拳击.
您可以使用.asObject方法使您的代码工作,
它不需要您将TableColumn Paramater更改为Number
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
Run Code Online (Sandbox Code Playgroud)
idk哪一个是更好的代码,
将参数更改为Number或使用asObject方法
归档时间: |
|
查看次数: |
18369 次 |
最近记录: |