【问题标题】:An issue with editable JFX TableView可编辑 JFX TableView 的问题
【发布时间】:2017-05-11 01:56:17
【问题描述】:

我对可编辑的 TableView 有一点问题。我想显示数据库中的数据,并且还可以进行编辑,然后将其保存回数据库。

现在,我可以编辑它了。我有一个 if 语句,它检查值是否为空白(空白或空格)并且它工作正常,如果值为空白,则 DB 中的项目不会得到更新。

我的问题是仍然显示空白值。如果我再次单击以编辑它,它会显示正确的值。 Here 是问题的图片。

这是在我的视图类中创建表格的方法。

 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;
    }

这是控制器类中处理编辑的部分。

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());

【问题讨论】:

    标签: user-interface javafx tableview


    【解决方案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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-25
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多