2017-01-11 17 views
-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); 
     } 
    }); 
+0

любое изменение значения choicebox вызовет связь с базой данных, даже если это вызванный методом 'updateItem' ... – fabian

+0

Хм, это облом. –

+0

Извините, я просто не понимаю этот вопрос. Почему бы вам просто не добавить дополнительное условие в оператор 'if', чтобы вы не вызывали' processEdit', если ничего не изменилось? –

ответ

0

решение - благодаря James_D

classroomChoiceBox.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> { 
     if (newValue != null && newValue != getItem()) { 
      processEdit(newValue); 
     } 
    }); 

 Смежные вопросы

  • Нет связанных вопросов^_^