Сопоставление ячеек таблицы - действие не выполнено

97
8

Я применяю фабрику ниже ячейки к столбцу.

    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. Я не получаю никаких исключений, кроме обработанного. Другие столбцы редактируются и выполняют задачу, как ожидалось.

Я понятия не имею, что здесь не так. Кто-нибудь может мне помочь, пожалуйста.

спросил(а) 2016-04-06T14:49:00+03:00 3 года, 10 месяцев назад
1
Решение
55

Поскольку вы всегда показываете поле со списком в (непустых) ячейках, вам действительно не нужно входить в режим редактирования, как это делает стандартный TextFieldTableCell т.д. Ваша реализация больше похожа на CheckBoxTableCell, которая существенно обходит механизм редактирования. Из документации для этого класса:

Обратите внимание, что CheckBoxTableCell отображает "LiveBox CheckBox", что означает, что CheckBox всегда интерактивен и может быть напрямую переключен пользователем. Это означает, что нет необходимости, чтобы ячейка вводила свое состояние редактирования (обычно двойным щелчком пользователя по ячейке пользователем). Побочным эффектом этого является то, что обычные вызовы редактирования (например, при фиксации редактирования) не будут вызываться. Если вы хотите получать уведомления об изменениях, рекомендуется непосредственно наблюдать за булевыми свойствами, которые управляются CheckBox.

Таким образом, реализация вашей ячейки ведет себя аналогичным образом: не вызывать edit(...) (что, я думаю, cancelEdit()) и не полагаться на commitEdit(...), cancelEdit() т. 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;
}

});

ответил(а) 2016-04-06T15:27:00+03:00 3 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема