表格单元格组合框 - 未执行操作

时间:2016-04-06 11:49:50

标签: javafx combobox tablecell

我将以下单元格工厂应用于列。

    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 个答案:

答案 0 :(得分:1)

由于您始终在(非空)单元格中显示组合框,因此您并不需要进入&#34;编辑&#34;模式作为标准TextFieldTableCell等。您的实现更类似于CheckBoxTableCell,它基本上绕过了编辑机制。来自documentation for that class

  

请注意,CheckBoxTableCell呈现CheckBox&#39; live&#39;,意思是   CheckBox始终是交互式的,可以直接切换   用户。这意味着细胞不必进入其中   编辑状态(通常由用户双击单元格)。一个   副作用是通常的编辑回调(例如on   编辑提交)将不会被调用。如果你想得到通知   更改时,建议直接观察布尔属性   由CheckBox操纵。

因此,您的单元格实现行为相似:不要调用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;
    }

});