Подтвердить что ты не робот

Свойства 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(...)? Любая помощь будет принята с благодарностью.

Спасибо!

4b9b3361

Ответ 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.

Источник и кредиты