web-dev-qa-db-fra.com

Propriétés JavaFX dans TableView

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!

26
Matt Perry

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.

59
James_D

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

lien connexe

8
buncis

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.

Source et crédits

0
swapyonubuntu