Комбинация ячеек таблицы - действие не выполнено
Я применяю приведенную ниже фабрику ячеек к столбцу.
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
, Я не получаю никаких исключений, кроме обработанного. Другие столбцы являются редактируемыми и выполняют задачи, как и ожидалось.
Я понятия не имею, что здесь не так. Кто-нибудь может мне помочь, пожалуйста.
1 ответ
Поскольку вы всегда отображаете поле со списком в (непустых) ячейках, вам не нужно переходить в режим "редактирования" как стандартный TextFieldTableCell
и т. д. Ваша реализация больше похожа на CheckBoxTableCell
, который по существу обходит механизм редактирования. Из документации для этого класса:
Обратите внимание, что CheckBoxTableCell визуализирует CheckBox "вживую", что означает, что CheckBox всегда интерактивен и может напрямую переключаться пользователем. Это означает, что нет необходимости, чтобы ячейка входила в свое состояние редактирования (обычно пользователь дважды щелкает по ячейке). Побочным эффектом этого является то, что обычные редактирующие обратные вызовы (например, при редактировании) не будут вызываться. Если вы хотите получать уведомления об изменениях, рекомендуется непосредственно наблюдать логические свойства, которыми манипулирует CheckBox.
Таким образом, реализация вашей ячейки ведет себя аналогично: не вызывайте edit(...)
(который я думаю, что все портит) и не полагайтесь на commitEdit(...)
, cancelEdit()
методы etc (которые не будут работать, поскольку вы не находитесь в состоянии редактирования), но просто обновите класс модели напрямую.
Я не могу проверить, так как нет 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;
}
});