Proprietà JavaFX in TableView

Mi sto insegnando come lavorare con le proprietà JavaFX all’interno di TableView e sto avendo problemi con alcuni tipi di proprietà. Ho un object Person che contiene due proprietà

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; } } 

Una volta creato dall’objective è utilizzare questo object in un TableView. Ho creato le due colonne della tabella in questo modo.

 TableColumn firstNameColumn = new TableColumn("First Name"); TableColumn ageColumn = new TableColumn("Age"); 

Quindi voglio impostare il valore della cella factory usando le espressioni Lambda. Questo è dove sorge il problema. StringProperty firstName funziona perfettamente. Tuttavia, IntegerProperty mi fornisce il messaggio di errore “Tipo non corrispondente: imansible convertire da IntegerProperty a ObservableValue

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

Qualcuno può far luce su cosa non va con ageColumn.setCellValueFactory (…)? Qualsiasi aiuto sarebbe molto apprezzato.

Grazie!

Una parte un po ‘strana dell’API della proprietà è che IntegerProperty implementa ObservableValue , not ObservableValue . Quindi, in qualche modo controintuitivamente, hai bisogno

 TableColumn ageColumn = new TableColumn("Age"); 

Per inciso, e non sono sicuro che ciò possa causare problemi, ma è più usuale utilizzare int anziché Integer per il tipo restituito per il metodo get e il tipo di parametro per il metodo set nella class del modello. Corrispondono ai tipi di IntegerProperty.get() e IntegerProperty.set(...) , quindi evitano solo il boxing automatico implicito (un).

puoi usare il metodo .asObject per far funzionare il tuo codice
non ha bisogno di cambiare il parametro TableColumn in Number

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

idk quale è il codice migliore,
cambia il parametro in Numero o usa il metodo asObject

Link correlato

Per tipo di stringa:

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

Quando si desidera utilizzare IntegerProperty o DoubleProperty , setCellValueFactory(...) deve avere un asObject() aggiuntivo:

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

Ciò è necessario a causa di una ctriggers decisione di progettazione di JavaFX.

Fonte e crediti