J'apprends moi-même comment utiliser les propriétés JavaFX dans TableView et rencontre des problèmes avec certains types de propriétés. J'ai un objet Person qui contient deux propriétés
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;
}
}
Une fois créé par objectif, vous devez utiliser cet objet dans une vue tableau. J'ai créé les deux colonnes de la table comme ceci.
TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age");
Je souhaite ensuite définir la fabrique de valeurs de cellules à l'aide d'expressions Lambda. C'est là que le problème se pose. StringProperty firstName fonctionne parfaitement. Cependant, IntegerProperty me donne le message d'erreur "Type incompatible: impossible de convertir de IntegerProperty
à ObservableValue<Integer>
"
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty());
Quelqu'un peut-il nous éclairer sur ce qui ne va pas avec l'ageColumn.setCellValueFactory (...)? Toute aide serait grandement appréciée.
Merci!
Une partie quelque peu étrange de la propriété API est que IntegerProperty
implémente ObservableValue<Number>
, pas ObservableValue<Integer>
. Donc, un peu contre-intuitivement, vous avez besoin
TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
En passant, et je ne suis pas sûr que cela pose des problèmes, mais il est plus habituel d'utiliser int
au lieu de Integer
pour le type de retour pour la méthode get et le type de paramètre pour la méthode set dans votre classe de modèle. Ceux-ci correspondent aux types de IntegerProperty.get()
et IntegerProperty.set(...)
, de sorte qu’il évite simplement un (un) box implicite.
vous pouvez utiliser .asObject, méthode pour que votre code fonctionne
il n’est pas nécessaire que vous changiez le paramètre TableColumn Paramater en Number
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
idk lequel est le meilleur code,
changez le paramètre en Number ou utilisez la méthode asObject
Pour le type de chaîne:
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
Lorsque vous souhaitez utiliser IntegerProperty
ou DoubleProperty
, la setCellValueFactory(...)
must a une asObject()
supplémentaire:
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
Cela est nécessaire à cause d'une mauvaise décision de conception de JavaFX.