【问题标题】:Is there a way to change the contents of a ComboBoxTableCell depending on the row and column that is being edited?有没有办法根据正在编辑的行和列更改 ComboBoxTableCell 的内容?
【发布时间】:2019-12-29 02:54:37
【问题描述】:

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

我尝试在列的 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();
            }

        }
    });

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

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    到目前为止,我还没有找到直接使用 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;
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2012-01-24
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      相关资源
      最近更新 更多