Комбинация ячеек таблицы - действие не выполнено

Я применяю приведенную ниже фабрику ячеек к столбцу.

    targetEnviroment.setCellFactory(new Callback<TableColumn<DevWorkTabBench, String>, TableCell<DevWorkTabBench, String>>() {

                @Override
                public TableCell<DevWorkTabBench, String> call(TableColumn<DevWorkTabBench, String> param) {
                    TableCell<DevWorkTabBench, String> cell = new TableCell<DevWorkTabBench, String>() {
                        @Override
                        public void updateItem(String item, boolean empty) {
                            super.updateItem(item, empty);

                            String status = null;
                            try {
                                status = getTableView().getItems().get(getIndex()).getObjectStatus();
                            } catch (IndexOutOfBoundsException ex) {
                            status = "";
                            }
                            if (status.equalsIgnoreCase("ReadyForDeployment")) {

                                ComboBox<String> comboBox = new ComboBox(environmentList);
                                comboBox.valueProperty().addListener(new ChangeListener<String>() {

                                    @Override
                                    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                                        commitEdit(newValue);
                                    }
                                });

                                comboBox.setOnShown(new EventHandler<Event>() {
                                    @Override
                                    public void handle(Event event) {
                                        getTableView().edit(getIndex(), getTableColumn());
                                        getTableView().getSelectionModel().select(getIndex());

                                    }
                                });
                                comboBox.setValue(item);
                                setGraphic(comboBox);
                            } else {
                                setGraphic(null);
                            }

                            if (empty) {
                                setGraphic(null);

                            }
                        }
                    };

                    return cell;
                }

            });

Когда я меняю status в упомянутый статус, я получаю вид ComboBox в этой конкретной ячейке, но выпадающий не происходит. Кажется, что даже после нескольких нажатий на combobox, Я не получаю никаких исключений, кроме обработанного. Другие столбцы являются редактируемыми и выполняют задачи, как и ожидалось.

Я понятия не имею, что здесь не так. Кто-нибудь может мне помочь, пожалуйста.

1 ответ

Решение

Поскольку вы всегда отображаете поле со списком в (непустых) ячейках, вам не нужно переходить в режим "редактирования" как стандартный TextFieldTableCell и т. д. Ваша реализация больше похожа на CheckBoxTableCell, который по существу обходит механизм редактирования. Из документации для этого класса:

Обратите внимание, что CheckBoxTableCell визуализирует CheckBox "вживую", что означает, что CheckBox всегда интерактивен и может напрямую переключаться пользователем. Это означает, что нет необходимости, чтобы ячейка входила в свое состояние редактирования (обычно пользователь дважды щелкает по ячейке). Побочным эффектом этого является то, что обычные редактирующие обратные вызовы (например, при редактировании) не будут вызываться. Если вы хотите получать уведомления об изменениях, рекомендуется непосредственно наблюдать логические свойства, которыми манипулирует CheckBox.

Таким образом, реализация вашей ячейки ведет себя аналогично: не вызывайте edit(...) (который я думаю, что все портит) и не полагайтесь на commitEdit(...), cancelEdit() методы etc (которые не будут работать, поскольку вы не находитесь в состоянии редактирования), но просто обновите класс модели напрямую.

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

targetEnviroment.setCellFactory(new Callback<TableColumn<DevWorkTabBench, String>, TableCell<DevWorkTabBench, String>>() {

    @Override
    public TableCell<DevWorkTabBench, String> call(TableColumn<DevWorkTabBench, String> param) {
        TableCell<DevWorkTabBench, String> cell = new TableCell<DevWorkTabBench, String>() {
            @Override
            public void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);

                if (empty) {
                    setGraphic(null) ;
                } else {
                    String status = getTableView().getItems().get(getIndex()).getObjectStatus();

                    if (status.equalsIgnoreCase("ReadyForDeployment")) {

                        ComboBox<String> comboBox = new ComboBox(environmentList);
                        comboBox.valueProperty().addListener(new ChangeListener<String>() {

                            @Override
                            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                                //commitEdit(newValue);
                                getTableView().getItems().get(getIndex()).setObjectStatus(newValue);
                            }
                        });

                        comboBox.setValue(item);
                        setGraphic(comboBox);
                    } else {
                        setGraphic(null);
                    }
                }
            }
        };

        return cell;
    }

});
Другие вопросы по тегам