Как правильно циклически применить изменения для таблица 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 шт):
Все гораздо проще, можно просто получить колонки методом .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. Тем не менее если это неверное решение, прошу того кто знает исправить.