-1
У меня есть настраиваемая ячейка таблицы для таблицы. Теперь проблема заключается в том, что функция commitEdit()
выполняется при создании таблицы. Проблема в том, что она замедляет работу программы, так как я обновляю элементы в своей базе данных, и каждый элемент обновляется.Функция CommitEdit выполняется при создании таблицы
public class ChoiceBoxCell extends TableCell<Student, Classroom> {
ChoiceBox<Classroom> classroomChoiceBox;
public ChoiceBoxCell(ObservableList<Classroom> classroomObservableList) {
classroomChoiceBox = new ChoiceBox<>();
classroomChoiceBox.setItems(classroomObservableList);
classroomChoiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> {
if (newValue != null) {
processEdit(newValue);
}
});
}
private void processEdit(Classroom value) {
commitEdit(value);
classroomChoiceBox.setValue(value);
setGraphic(classroomChoiceBox);
}
@Override
public void cancelEdit() {
super.cancelEdit();
setGraphic(classroomChoiceBox);
}
@Override
public void commitEdit(Classroom value) { // gets executed on start up
super.commitEdit(value);
Student student = (Student) getTableRow().getItem();
student.setClassroom(value);
new StudentDao().updateStudent(student); // students get updated for no reason
classroomChoiceBox.setValue(value);
setGraphic(classroomChoiceBox);
}
@Override
public void startEdit() {
super.startEdit();
Classroom value = getItem();
if (value != null) {
classroomChoiceBox.setValue(value);
setGraphic(classroomChoiceBox);
}
}
@Override
protected void updateItem(Classroom item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
classroomChoiceBox.setValue(item);
setGraphic(classroomChoiceBox);
}
}
}
EDIT: Решение - благодаря @James_D
classroomChoiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> {
if (newValue != null && newValue != getItem()) {
processEdit(newValue);
}
});
любое изменение значения choicebox вызовет связь с базой данных, даже если это вызванный методом 'updateItem' ... – fabian
Хм, это облом. –
Извините, я просто не понимаю этот вопрос. Почему бы вам просто не добавить дополнительное условие в оператор 'if', чтобы вы не вызывали' processEdit', если ничего не изменилось? –