Свойства JavaFX в TableView
Я преподаю, как работать с свойствами JavaFX в TableView, и у меня возникают проблемы с некоторыми типами свойств. У меня есть объект Person, который содержит два свойства
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;
}
}
После создания цели следует использовать этот объект в TableView. Я создал два столбца таблицы следующим образом.
TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name");
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age");
Затем я хочу установить значение ячейки factory, используя выражения Lambda. Здесь возникает проблема. StringProperty firstName работает отлично. Однако IntegerProperty дает мне сообщение об ошибке "Несоответствие типа: невозможно преобразовать из IntegerProperty
в ObservableValue<Integer>
"
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty());
Может ли кто-нибудь пролить свет на то, что не так с ageColumn.setCellValueFactory(...)? Любая помощь будет принята с благодарностью.
Спасибо!
Ответы
Ответ 1
Одна довольно странная часть API свойств заключается в том, что IntegerProperty
реализует ObservableValue<Number>
, а не ObservableValue<Integer>
. Итак, несколько контринтуитивно, вам нужно
TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age");
Как и в сторону, и я не уверен, что это вызывает проблемы, но более привычно использовать int
вместо Integer
для типа возвращаемого значения метода get и типа параметра для метода set в вашем модель класс. Они соответствуют типам IntegerProperty.get()
и IntegerProperty.set(...)
, поэтому он просто избегает неявного автоматического (un) бокса.
Ответ 2
вы можете использовать метод .asObject, чтобы заставить ваш код работать
вам не нужно менять параметр TableColumn Paramater на Number
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
idk, который лучше кода,
измените параметр на "Number" или используйте метод "Объект"
Связанная ссылка
Ответ 3
Для типа строки:
firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty());
Если вы хотите использовать IntegerProperty
или DoubleProperty
, setCellValueFactory(...)
должен иметь дополнительный asObject()
:
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject());
Это необходимо из-за плохого дизайнерского решения JavaFX.
Источник и кредиты