Проблема с редактируемым Jfx TableView

У меня есть небольшая проблема с редактируемым TableView. Я хочу, чтобы отобразить данные из базы данных, а также иметь возможность редактировать, то, что сохраняет его обратно в БД.

Теперь я могу отредактировать его. У меня есть оператор if, который проверяет, является ли значение пустым (пустым или пробелом), и он работает должным образом, элемент в DB не обновляется, если значение пустое.

Моя проблема заключается в том, что пустое значение по-прежнему отображается. Если я щелкну, чтобы изменить его снова, он отображает правильное значение. Вот картина вопроса.

Вот метод, который создает таблицу в моем классе представления.

 private TableView<Teacher> createTable(){
         TableView table = new TableView();
         table.setEditable(true);
         table.setPrefWidth(500);
         table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

         nameColumn = new TableColumn<>("Jméno");
         surnameColumn = new TableColumn<>("Příjmení");
         nickColumn = new TableColumn<>("Nick");

         table.getColumns().addAll(nameColumn, surnameColumn, nickColumn);

         int columnCount = table.getColumns().size();
         double columnSize = Math.floor(table.getPrefWidth() / columnCount);

         nameColumn.setPrefWidth(columnSize);
         surnameColumn.setPrefWidth(columnSize);
         nickColumn.setPrefWidth(columnSize);

         nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
         surnameColumn.setCellValueFactory(new PropertyValueFactory<>("surname"));
         nickColumn.setCellValueFactory(new PropertyValueFactory<>("nick"));

         List<Teacher> list = new TeacherDao().getAllTeachers();
         ObservableList<Teacher> observableList = FXCollections.observableArrayList(list);

         table.setItems(observableList);

         return table;
    }

Вот часть класса controller для обработки изменений.

private void onEditAction(){
    view.getNameColumn().setCellFactory(TextFieldTableCell.forTableColumn());
    view.getNameColumn().setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<Teacher, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<Teacher, String> col) {
                    String newValue = col.getNewValue();
                    if(!(CheckString.isBlank(newValue))) {
                        (col.getTableView().getItems().get(
                                col.getTablePosition().getRow())
                        ).setName(col.getNewValue());

                        Teacher teacher = view.getTeacherTableView().getSelectionModel().getSelectedItem();
                        int id = teacher.getUser_id();
                        new TeacherDao().updateTeacherNick(id, newValue);
                    }
                }
            }
    );

    view.getSurnameColumn().setCellFactory(TextFieldTableCell.forTableColumn());
    view.getSurnameColumn().setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<Teacher, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<Teacher, String> col) {
                    String newValue = col.getNewValue();
                    if(!(CheckString.isBlank(newValue))) {
                        (col.getTableView().getItems().get(
                                col.getTablePosition().getRow())
                        ).setName(col.getNewValue());

                        Teacher teacher = view.getTeacherTableView().getSelectionModel().getSelectedItem();
                        int id = teacher.getUser_id();
                        new TeacherDao().updateTeacherNick(id, newValue);
                    }
                }
            }
    );

    view.getNickColumn().setCellFactory(TextFieldTableCell.forTableColumn());
    view.getNickColumn().setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<Teacher, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<Teacher, String> col) {
                    String newValue = col.getNewValue();
                    if(!(CheckString.isBlank(newValue))) {
                        (col.getTableView().getItems().get(
                                col.getTablePosition().getRow())
                        ).setName(col.getNewValue());

                        Teacher teacher = view.getTeacherTableView().getSelectionModel().getSelectedItem();
                        int id = teacher.getUser_id();
                        new TeacherDao().updateTeacherNick(id, newValue);
                    }
                }
            }
    );
}

Я также попытался добавить, это не помогло, хотя.

   else
        (col.getTableView().getItems().get(
             col.getTablePosition().getRow())
        ).setName(col.getOldValue());

1 ответ

  1. Ну, мне удалось ее решить, вот как если кому интересно

    public class TeacherTableView extends TableView {
    
        private TableColumn<Teacher, String> nameColumn, surnameColumn, nickColumn;
    
        TeacherTableView() {
            createTable();
            onEditAction();
        }
    
        private void createTable(){
            setEditable(true);
            setPrefWidth(500);
            getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
    
            nameColumn = new TableColumn<>("Jméno");
            surnameColumn = new TableColumn<>("Příjmení");
            nickColumn = new TableColumn<>("Nick");
    
            getColumns().addAll(nameColumn, surnameColumn, nickColumn);
    
            int columnCount = getColumns().size();
            double columnSize = Math.floor(getPrefWidth() / columnCount);
    
            nameColumn.setPrefWidth(columnSize);
            nameColumn.setCellValueFactory(cdf -> cdf.getValue().nameProperty());
            nameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
            nameColumn.setEditable(true);
    
            surnameColumn.setPrefWidth(columnSize);
            surnameColumn.setCellValueFactory(cdf -> cdf.getValue().surnameProperty());
            surnameColumn.setCellFactory(TextFieldTableCell.forTableColumn());
            surnameColumn.setEditable(true);
    
            nickColumn.setPrefWidth(columnSize);
            nickColumn.setCellValueFactory(cdf -> cdf.getValue().nickProperty());
            nickColumn.setCellFactory(TextFieldTableCell.forTableColumn());
            nickColumn.setEditable(true);
    
    
            List<Teacher> list = new TeacherDao().getAllTeachers();
            ObservableList<Teacher> observableList = FXCollections.observableArrayList(list);
    
            setItems(observableList);
        }
    
        private void onEditAction(){
            nameColumn.setOnEditCommit(this::updateCol);
            surnameColumn.setOnEditCommit(this::updateCol);
            nickColumn.setOnEditCommit(this::updateCol);
        }
    
        private void updateCol(TableColumn.CellEditEvent<Teacher, String> col) {
            String newValue = col.getNewValue();
            if (CheckString.isNotBlank(newValue)) {
                (col.getTableView().getItems().get(
                        col.getTablePosition().getRow())
                ).setName(col.getNewValue());
    
                Teacher teacher = (Teacher) getSelectionModel().getSelectedItem();
                int id = teacher.getUser_id();
                new TeacherDao().updateTeacherNick(id, newValue);
            } else {
                col.getTableView().refresh();
            }
        }
    }