Ни startEdit, ни setOnEditCommit не вызывают

Я следовал этому примеру, упомянутому в этой ссылке - UITableView - лучше редактировать через Binding? Я изменил это немного соответственно

Model class - 

     public static class TableData {

        private String firstName, lastName;

        private TableData(String first, String last) {
            this.firstName = first;
            this.lastName = last;
        }

        public String getFirstName() {
            return firstName;
        }

        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }

        public String getLastName() {
            return lastName;
        }

        public void setLastName(String lastName) {
            this.lastName = lastName;
        }

    }

Custom Cell factory -

     public static class TextFieldCellFactory implements Callback<TableColumn<TableData, String>, TableCell<TableData, String>> {

    @Override
    public TableCell<TableData, String> call(TableColumn<TableData, String> param) {
        TextFieldCell textFieldCell = new TextFieldCell();
        return textFieldCell;
    }

    public static class TextFieldCell extends TableCell<TableData, String> {

        private TextField textField;
        private StringProperty boundToCurrently = null;
        private String newval = "";

        public TextFieldCell() {


            textField = new TextField();
            textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        System.out.println("key pressed");
                        commitEdit(textField.getText());

                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });

            textField.textProperty().addListener(new ChangeListener<String>() {

                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
             // throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.

                    // commitEdit(newValue);
                    System.out.println("" + newValue);
                    newval = newValue;
                }

            });

            textField.focusedProperty().addListener(new ChangeListener<Boolean>() {

                public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {

                        if(!newValue){
                        System.out.println("losing focus" + newval);
                        //commichange();
                        commitEdit(textField.getText());
                        }

                    }
                });



            this.setGraphic(textField);
        }

        @Override
        protected void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (!empty) {
                // Show the Text Field
                this.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                textField.setText(item);



            } else {
                this.setContentDisplay(ContentDisplay.TEXT_ONLY);
            }
        }

    }
}

настройка onEditCommit-

c1.setOnEditCommit(
            new EventHandler<TableColumn.CellEditEvent<TableData, String>>() {
                @Override
                public void handle(TableColumn.CellEditEvent<TableData, String> t) {
                    System.out.println("ON edit commit" + t);
                    ((TableData) t.getTableView().getItems().get(
                            t.getTablePosition().getRow())).setFirstName(t.getNewValue());
                }
            }
    );
  1. Проблема 1- Я хочу знать, что происходит при вызове commitEdit(). Вызывает ли он setOnEditCommit? Если это так, то почему он не вызывает setOnEditCoommit
  2. Проблема 2 - Почему это не входит в setOnEditCommit?
  3. Задача 3 Я применил startEdit, чтобы проверить, входит ли он в это поле. Но этот метод также не вызывается.

Может кто-нибудь указать, что я здесь упускаю. Я не хочу обходной путь. Мне нужно понять, в чем причина этого PS Я удалил обязательные свойства, как указано в ссылке.

1 ответ

Решение

Ваша таблица никогда не переходит в состояние редактирования (потому что вы никогда не просите об этом). Потому что клетка никогда не имеет isEditing() вернуть true, по умолчанию commitEdit() метод становится неоперативным.

Вам нужно TableView знать, что он должен начать редактирование ячейки, когда текстовое поле в этой ячейке получает фокус. Вы можете сделать это, изменив слушатель фокуса на текстовое поле:

                textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
                    @Override
                    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                        if (newValue) {
                            getTableView().edit(getIndex(), getTableColumn());
                        } else {
                            commitEdit(textField.getText());
                        }
                    }
                });
Другие вопросы по тегам