未执行表单元格操作



我正在将下面的单元格工厂应用于列。

    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,但不会出现下降。即使在多次点击之后,似乎也不会对CCD_ 3执行任何操作。除了已处理的异常,我没有其他异常。其他列是可编辑的,并按预期执行任务。

我不知道这里出了什么问题。有人能帮我吗?

由于您总是在(非空)单元格中显示组合框,因此您实际上不需要像标准TextFieldTableCell等那样进入"编辑"模式。您的实现更类似于CheckBoxTableCell,它基本上绕过了编辑机制。来自该类的文档:

请注意,CheckBoxTableCell将CheckBox呈现为"live",意思是复选框始终是交互式的,可以通过用户。这意味着细胞没有必要进入编辑状态(通常由用户双击单元格)。A.这样做的副作用是,通常的编辑回调(例如edit-commit)。如果你想得到通知更改时,建议直接观察布尔属性由复选框操纵。

因此,您的单元实现的行为类似:不要调用edit(...)(我认为这会把事情搞砸),也不要依赖commitEdit(...)cancelEdit()等方法(因为您没有处于编辑状态,所以这些方法不起作用),而是直接更新模型类。

我不能测试,因为没有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;
    }
});

最新更新