我将以下单元格工厂应用于列。
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
执行任何操作。我没有得到任何除了处理之外的例外。其他列可编辑并按预期执行任务。
我不知道这里有什么问题。任何人都可以帮助我。
答案 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;
}
});