我正在使用具有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();
}
}
});
我希望在状态栏上双击时输出是一个组合框,但是当我得到时并没有出现组合框
答案 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;
}
});