javafx tablecolumn里放下拉框,第二次进入编辑状态点其他地方为什么不触发取消编辑状态
时间: 2023-11-27 20:54:33 浏览: 150
在JavaFX中,当单元格处于编辑模式时,点击其他单元格或其他地方时,不会自动触发取消编辑状态。这是因为JavaFX默认情况下,只有单击回车键或单击“提交”按钮才会触发提交编辑状态。
如果您希望在点击其他地方时自动取消编辑状态,您可以使用以下方法:
1. 为表格列设置一个自定义的单元格工厂,该工厂在单元格被编辑时创建一个下拉框,并在单元格失去焦点时取消编辑状态。
```java
TableColumn<MyData, String> myColumn = new TableColumn<>("My Column");
myColumn.setCellFactory(column -> {
return new TableCell<MyData, String>() {
private ComboBox<String> comboBox;
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty || !isEditing()) {
setText(item);
} else {
if (comboBox != null) {
comboBox.setValue(item);
}
setGraphic(comboBox);
}
}
@Override
public void startEdit() {
super.startEdit();
if (comboBox == null) {
comboBox = new ComboBox<>();
comboBox.getItems().addAll("Option 1", "Option 2", "Option 3");
comboBox.setOnAction(event -> {
commitEdit(comboBox.getValue());
});
}
comboBox.setValue(getItem());
setGraphic(comboBox);
}
@Override
public void cancelEdit() {
super.cancelEdit();
setGraphic(null);
}
@Override
public void commitEdit(String value) {
super.commitEdit(value);
setGraphic(null);
}
};
});
```
2. 在表格的行工厂中为每个单元格添加一个失去焦点的监听器,该监听器在单元格失去焦点时取消编辑状态。
```java
tableView.setRowFactory(tv -> {
TableRow<MyData> row = new TableRow<>();
row.focusedProperty().addListener((obs, wasFocused, isNowFocused) -> {
if (! isNowFocused) {
tableView.refresh();
}
});
return row;
});
```
使用以上方法,当您点击其他地方时,单元格将自动取消编辑状态。
阅读全文