Как правильно циклически применить изменения для таблица TableView на JavaFX

Есть класс Phmech который используется для работы с таблицей TableView на JavaFX. У класса много полей, а у таблицы много столбцов. Вручную прописывать setCellValueFactory и setOnEditCommit для каждого столбца конечно можно, но очень неудобно. Поэтому я попытался циклически назначить переопределение значения поля класса при изменении соотвествующей ячейки в таблице.

Я поместил все TableColumn<Phmech, String> в List<List<TableColumn<Phmech, String>>> cols и проитерировал:

for (TableColumn<Phmech, String> node: cols) {
        node.setCellValueFactory(new PropertyValueFactory<Phmech, String>(node.toString()));
        node.setCellFactory(TextFieldTableCell.forTableColumn());
        node.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Phmech, String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent<Phmech, String> event) {
                Phmech phmech = event.getRowValue();
                Class<? extends Object> clazz = phmech.getClass();
                try {
                    Field field = clazz.getField(node.toString());
                    field.set(phmech, event.getNewValue());
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }

            }
        });
    }

Соответсвенно через рефликсию пытаюсь поменять значения поля по его String наименованию, но где-то есть ошибка.


Ответы (1 шт):

Автор решения: AddmiX

Все гораздо проще, можно просто получить колонки методом .getColumns и не toString а getId.

for (TableColumn col: phmech_table.getColumns()) {
        col.setCellValueFactory(new PropertyValueFactory<Phmech, String>(col.getId()));
        col.setCellFactory(TextFieldTableCell.forTableColumn());
        col.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Phmech, String>>() {
            @Override
            public void handle(TableColumn.CellEditEvent event) {
                Phmech phmech = (Phmech) event.getRowValue();
                Class<? extends Object> clazz = phmech.getClass();
                try {
                    Field field = clazz.getField(col.getId());
                    field.set(phmech, event.getNewValue());
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        });
    }

Однако, это работает только если все ячейки имеют тип String. Тем не менее если это неверное решение, прошу того кто знает исправить.

→ Ссылка