我正在将下面的单元格工厂应用于列。
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
,但不会出现下降。即使在多次点击之后,似乎也不会对CCD_ 3执行任何操作。除了已处理的异常,我没有其他异常。其他列是可编辑的,并按预期执行任务。
我不知道这里出了什么问题。有人能帮我吗?
由于您总是在(非空)单元格中显示组合框,因此您实际上不需要像标准TextFieldTableCell
等那样进入"编辑"模式。您的实现更类似于CheckBoxTableCell
,它基本上绕过了编辑机制。来自该类的文档:
请注意,CheckBoxTableCell将CheckBox呈现为"live",意思是复选框始终是交互式的,可以通过用户。这意味着细胞没有必要进入编辑状态(通常由用户双击单元格)。A.这样做的副作用是,通常的编辑回调(例如edit-commit)。如果你想得到通知更改时,建议直接观察布尔属性由复选框操纵。
因此,您的单元实现的行为类似:不要调用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;
}
});