Propriétés de JavaFX dans TableView

Je m'apprends à travailler avec les propriétés JavaFX dans TableView et j'ai des problèmes avec certains types de propriétés. J'ai un objet Personne 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 est d'utiliser cet objet dans une TableView. J'ai créé les deux colonnes du tableau comme ceci.

TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age");

je veux alors définir la valeur de l'usine de cellules en utilisant des expressions Lambda. C'est là que le problème se pose. Le premier nom StringProperty fonctionne très bien. Cependant, L'IntegerProperty me donne le message d'erreur "incompatibilité de Type: impossible de convertir de IntegerPropertyObservableValue<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!

25
demandé sur James_D 2014-07-22 18:07:41
la source

3 ответов

une partie un peu étrange de l'API de propriété est que IntegerProperty implémente ObservableValue<Number>, pas ObservableValue<Integer>. Donc, quelque peu contre-intuitivement, vous avez besoin de

TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");

comme une mise de côté, et je ne suis pas sûr si cela cause 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 model. Ceux-ci correspondent aux types pour IntegerProperty.get() et IntegerProperty.set(...), donc il évite juste une certaine auto (un)boxe implicite.

58
répondu James_D 2014-07-22 18:41:23
la source

vous pouvez utiliser .asObject Méthode pour faire de votre code fonctionne

il n'a pas besoin de vous pour changer le paramétrage TableColumn en nombre

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());

idk quel est le meilleur code,

changez le paramètre en nombre ou utilisez la méthode asObject

Lien

7
répondu icemelt 2014-11-21 16:58:09
la source

Pour le type de Chaîne :

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());

Lorsque vous souhaitez utiliser IntegerProperty ou DoubleProperty, le setCellValueFactory(...) ont asObject():

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());

Ceci est nécessaire en raison d'une mauvaise décision de JavaFX.

Source et crédits

0
répondu swapyonubuntu 2016-10-30 10:22:40
la source

Autres questions sur