data - tablecolumn javafx
Propiedades de JavaFX en TableView (3)
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.
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 objetivo es utilizar este objeto en un TableView. Creé las dos columnas de la tabla como esta.
TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("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<Integer>
"
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<Number>
, no ObservableValue<Integer>
. Entonces, de manera un tanto intuitiva, necesitas
TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("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 autobloqueos (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