有没有一种方法可以根据要编辑的行和列来更改ComboBoxTableCell的内容?

时间:2019-08-23 19:35:56

标签: java javafx

我正在使用具有5列(列的数据类型)的JavaFX表格视图:任务ID(int),任务名称(String),任务描述(String),状态(String)和备注(String)。现在,我正在从具有相同列的数据库中加载数据,而我想做的是,当用户单击软件中的任务状态列时,列单元格更改为组合框(字符串),但列表组合框中显示的状态应有所不同,具体取决于用户尝试编辑的所选项目(即任务的状态)

我尝试在列的OnEdit中创建一个新的cellFactory,并且还尝试覆盖更新项方法,并使用布尔值变量来设置是否将图形设置为组合框

 myStatusColumn.setOnEditStart(new EventHandler<TableColumn.CellEditEvent<Task, String>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<Task, String> event) {
            try {
                dataBeingEdited = true;
                Task task =  myTasksTable.getSelectionModel().getSelectedItem();
                statuses = Login.dbHandler.getStatuses(task.getTaskTypeID());
                myStatusColumn.setCellFactory(new Callback<TableColumn<Task, String>, TableCell<Task, String>>() {
                    @Override
                    public TableCell<Task, String> call(TableColumn<Task, String> param) {
                        return new TableCell<Task,String>(){
                            @Override
                            protected void updateItem(String item, boolean empty) {
                                super.updateItem(item, empty);
                                if(empty)
                                    setGraphic(null);
                                else
                                {
                                    if(dataBeingEdited)
                                    {
                                        ComboBox<String> comboBox = new ComboBox<>(statuses);
                                        setGraphic(comboBox);
                                    }
                                }
                            }
                        };
                    }
                });
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    });

我希望在状态栏上双击时输出是一个组合框,但是当我得到时并没有出现组合框

1 个答案:

答案 0 :(得分:0)

到目前为止,我还没有找到直接使用ComboBoxTableCell类的方法,但是我所做的是使用CellFactory重新设计了我自己的方法。我所做的是在返回在CellFactory中创建的Cell之前,我设置了一个onMouseClickedListner来检查双击,当用户双击时,我将从表中选择项,并将图形设置为一个Combobox,其值取决于在所选的行上,然后单击该列 然后设置一个onKeyPressedListener,它将更改选定的项目,然后刷新表并更新数据库

myStatusColumn.setCellFactory(new Callback<TableColumn<Task, String>, TableCell<Task, String>>() {
        @Override
        public TableCell<Task, String> call(TableColumn<Task, String> param) {
            ComboBox<String> box = new ComboBox<>();
            TableCell<Task, String> cell = new TableCell<Task, String>() {

                @Override
                protected void updateItem(String item, boolean empty) {
                    if (empty)
                        setGraphic(null);
                    else {
                            setEditable(false);
                            setText(item);
                    }
                }
            };
            cell.setOnMouseClicked(new EventHandler<MouseEvent>() {
                @Override
                public void handle(MouseEvent event) {
                    if(event.getButton().equals(MouseButton.PRIMARY))
                    {
                         Task task = myTasksTable.getSelectionModel().getSelectedItem();
                        if(task!=null)
                            box.setItems(FXCollections.observableArrayList(task.getStatuses()));
                        cell.setEditable(true);
                    }
                    if(event.getClickCount()==2 && cell.isEditable() ) {
                        box.getSelectionModel().select(0);
                        cell.setText(null);
                        cell.setGraphic(box);
                    }

                }
            });

            cell.setOnKeyPressed(new EventHandler<KeyEvent>() {
                @Override
                public void handle(KeyEvent event) {
                    if(event.getCode().equals(KeyCode.ENTER))
                    {
                        try {
                            TaskLog taskLog = (TaskLog) myTasksTable.getSelectionModel().getSelectedItem();
                            if(taskLog != null) {
                                taskLog.setStatues(box.getSelectionModel().getSelectedItem());
                                taskLog.setStatuesID(Login.dbHandler.getStatusID(taskLog.getStatues()));
                                System.out.println(taskLog.getStatues());
                                Login.dbHandler.addNewTaskLog(taskLog);
                                cell.setEditable(false);
                                myTasksTable.refresh();
                            }
                        } catch (SQLException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            return cell;
        }
    });