Table cell combobox - action not performed

为君一笑 提交于 2019-12-11 23:32:20

问题


I'm applying the below cell factory to a column.

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

            });

When I change the status to the mentioned status, I get the look of ComboBox in that particular cell but the drop down does not occur. Even after multiple clicks no action seems to be performed on the combobox. I do not get any exception other than the handled one. Other columns are editable and performing task as expected.

I have no idea what is wrong here. Can anyone please help me.


回答1:


Since you are always displaying the combo box in the (non-empty) cells, you don't really need to go into "editing" mode as the standard TextFieldTableCell etc does. Your implementation is more similar to the CheckBoxTableCell, which essentially bypasses the editing mechanism. From the documentation for that class:

Note that the CheckBoxTableCell renders the CheckBox 'live', meaning that the CheckBox is always interactive and can be directly toggled by the user. This means that it is not necessary that the cell enter its editing state (usually by the user double-clicking on the cell). A side-effect of this is that the usual editing callbacks (such as on edit commit) will not be called. If you want to be notified of changes, it is recommended to directly observe the boolean properties that are manipulated by the CheckBox.

So your cell implementation behaves similarly: don't invoke edit(...) (which I think is messing things up) and don't rely on the commitEdit(...), cancelEdit() etc methods (which won't work as you're not in editing state), but just update the model class directly.

I can't test, since there isn't a MCVE to work from, so this might not work directly, but it should be enough to get you started toward something that will work.

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

});


来源:https://stackoverflow.com/questions/36450297/table-cell-combobox-action-not-performed

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!