Propiedades de JavaFX en TableView

Me enseño cómo trabajar con las propiedades JavaFX dentro de TableView y tengo problemas con algunos tipos de propiedades. Tengo un objeto Persona que contiene dos propiedades

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 vez creado por el objective es utilizar este objeto en un TableView. Creé las dos columnas de la tabla como esta.

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

Luego quiero establecer el valor de la celda de fábrica usando expresiones Lambda. Aquí es donde surge el problema. StringProperty firstName funciona bien. Sin embargo, IntegerProperty me da el mensaje de error “Tipo de discrepancia: no se puede convertir de IntegerProperty a ObservableValue

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

¿Alguien puede arrojar algo de luz sobre lo que está yendo mal con ageColumn.setCellValueFactory (…)? Cualquier ayuda sería muy apreciada.

¡Gracias!

Una parte un tanto extraña de la propiedad API es que IntegerProperty implementa ObservableValue , no ObservableValue . Entonces, de manera un tanto intuitiva, necesitas

 TableColumn ageColumn = new TableColumn("Age"); 

Como un aparte, y no estoy seguro si esto causa problemas, pero es más habitual usar int lugar de Integer para el tipo de retorno para el método get y el tipo de parámetro para el método set en su clase de modelo. Estos coinciden con los tipos de IntegerProperty.get() y IntegerProperty.set(...) , por lo que simplemente evita algunos autolockings (implícitos).

puedes usar el método .asObject para hacer que tu código funcione
no necesita que cambie el parámetro de columna de tabla al número

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

idk cuál es mejor código,
cambie el parámetro a Number o use asObject Method

enlace relacionado

Para tipo de cadena:

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

Cuando desee utilizar IntegerProperty o DoubleProperty , setCellValueFactory(...) debe tener asObject() adicional:

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

Esto es necesario debido a una mala decisión de diseño de JavaFX.

Fuente y créditos