Проверка редактируемой ячейки в onEditCommit в TableColumn

Я пишу редактируемую таблицу с помощью JavaFX. Я хочу проверить ввод (например, существует ли такое же значение в таблице / столбце), если проверка не удалась. Я хочу отклонить новое значение. Другими словами, когда пользователь вводит новое значение в ячейку и нажимает клавишу ВВОД, я выполняю свою проверку, и если это не удается, я хочу увидеть в ячейке старое значение.

Мой код очень похож на этот пример http://java-buddy.blogspot.com/2012/04/javafx-2-editable-tableview.html

Я думал, что смогу сделать что-то подобное

colName.setCellFactory(trainerStringCellFactory);
colName.setOnEditCommit(
  new EventHandler<TableColumn.CellEditEvent<GymTrainer, String>>() {
    public void handle(TableColumn.CellEditEvent<GymTrainer, String> t) {
       GymTrainer newTrainer = new GymTrainer(t.getNewValue(), trainer.getSurrname(), trainer.getRateOfPay());
       newTrainer.setTrainerId(trainer.getTrainerId());
   if ( !updateTrainer(newTrainer) ) {
          // Here I would like to replace value in editable cell
       }
     }
   }
 });

Кто-нибудь знает, как это сделать, или, может быть, это не место?


person tommi.best    schedule 28.11.2013    source источник


Ответы (1)


Через несколько дней я нашел способ решить эту проблему. Во-первых, если вы не обновляете данные, связанные со строкой в ​​TableView (в моем случае это был GymTrainer), то после запуска приложения снова было показано старое значение, поэтому мне пришлось обновить TableColumn, чтобы реальные значения из GymTrainer отображается экземпляр.

Я сделал это, используя обходной путь из этого сообщения: элементы обновления JavaFX 2.1 TableView

Код будет выглядеть так:

colName.setCellFactory(trainerStringCellFactory);
colName.setOnEditCommit(
  new EventHandler<TableColumn.CellEditEvent<GymTrainer, String>>() {
    public void handle(TableColumn.CellEditEvent<GymTrainer, String> t) {
       GymTrainer newTrainer = new GymTrainer(t.getNewValue(), trainer.getSurrname(), trainer.getRateOfPay());
       newTrainer.setTrainerId(trainer.getTrainerId());
       if ( !updateTrainer(newTrainer) ) {
         tblTrainers.getColumns().get(0).setVisible(false);
         tblTrainers.getColumns().get(0).setVisible(true);
       }
    }
  }
 });

Может, это кому-нибудь поможет.

person tommi.best    schedule 01.12.2013