可编辑JFX TableView的问题

时间:2016-12-26 16:47:28

标签: user-interface javafx tableview

我对可编辑的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());

1 个答案:

答案 0 :(得分:0)

好吧,我设法解决了,这就是如果有人好奇的话

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