Как я могу отредактировать ячейку в JavaFX с IntegerProperty? - PullRequest
0 голосов
/ 13 февраля 2019

Я сделал редактируемую таблицу.Для столбцов со свойством String ist:

col_age.setCellFactory(TextFieldTableCell.forTableColumn());
    col_age.setOnEditCommit(new EventHandler<CellEditEvent>() {
        @Override
        public void handle(CellEditEvent event) {
            String a = event.getNewValue().toString();
            int i = Integer.parseInt(a);
            ((Persona)event.getTableView().getItems().get(
                    event.getTablePosition().getRow()
            )).setAge(i);
        }
    });

Теперь я хочу сделать возраст столбцов редактируемым.Но возраст - это целое число.Поэтому я попытался это:

col_age.setCellFactory(TextFieldTableCell.forTableColumn());
    col_age.setOnEditCommit(new EventHandler<CellEditEvent>() {
        @Override
        public void handle(CellEditEvent event) {
            String a = event.getNewValue().toString();
            int i = Integer.parseInt(a);
            ((Persona)event.getTableView().getItems().get(
                    event.getTablePosition().getRow()
            )).setAge(i);
        }
    });

Но я получаю следующее сообщение об ошибке:

Причина: java.lang.ClassCastException: java.lang.Integer не может быть приведен к java.lang.String

Может ли кто-нибудь мне помочь?

Спасибо.

1 Ответ

0 голосов
/ 13 февраля 2019

TextFieldTableCell.forTableColumn() работает только для TableColumn с String в качестве параметра второго типа, т.е. cellValueFactory должен возвращать ObservableValue<String>.IntegerProperty реализует ObservableValue<Number>.Проблема заключается в том, что ячейка пытается преобразовать элемент в String.

. Необходимо указать StringConverter для любого типа элемента столбца, кроме String:

col_age.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<Number>() {

    @Override
    public String toString(Number value) {
        return value == null ? "" : value.toString();
    }

    @Override
    public Number fromString(String value) {
        return (value == null) ? null : Integer.parseInt(value);
    }

}));

Таким образом, вы должны получить Number для свойства newValue события:

col_age.setOnEditCommit(new EventHandler<CellEditEvent>() {
    @Override
    public void handle(CellEditEvent event) {
        Number a = (Number) event.getNewValue();
        ((Persona)event.getTableView().getItems().get(
                event.getTablePosition().getRow()
        )).setAge(a.intValue());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...