TableView中的JavaFX属性
我正在自学如何在TableView中使用JavaFX属性,并且在某些属性类型上遇到了问题。我有一个对象Person,它包含两个属性TableView中的JavaFX属性,javafx,tableview,Javafx,Tableview,我正在自学如何在TableView中使用JavaFX属性,并且在某些属性类型上遇到了问题。我有一个对象Person,它包含两个属性 public class Person { private final StringProperty firstName; private final IntegerProperty age; public Person(String firstName, Integer age) { this.firstName = n
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");
有人能解释一下ageColumn.setCellValueFactory(…)到底出了什么问题吗?任何帮助都将不胜感激
谢谢 属性API的一个有点奇怪的部分是
IntegerProperty
实现了observeValue
,而不是observeValue
。所以,有点违反直觉,你需要
TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
TableColumn ageColumn=新的TableColumn(“年龄”);
顺便说一句,我不确定这是否会导致问题,但对于模型类中get方法的返回类型和set方法的参数类型,通常使用
int
而不是Integer
。它们与IntegerProperty.get()
和IntegerProperty.set(…)
的类型相匹配,因此它只是避免了一些隐式的自动(取消)装箱。您可以使用.asObject方法使代码正常工作不需要将TableColumn参数更改为Number
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
idk哪种代码更好,将参数更改为数字或使用对象方法 对于字符串类型:
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
如果要使用IntegerProperty
或DoubleProperty
,则setCellValueFactory(…)
必须有一个额外的asObject()
:
这是必要的,因为JavaFX的设计决策很糟糕
如果您将其作为对象返回,它可能会打印toString方法,并将值作为字符串,我认为这是默认行为
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());