CheckBoxTableCell changelistener не работает
Я пытаюсь добавить слушатель изменений в свои CheckBoxTableCells, но, похоже, он не работает. Я взял пример для CheckBox, полагая, что они будут работать одинаково. Однако, когда я меняю его значение, выход не выводится. Как бы я добавить один правильно в клетку checkboxtable?
текущий код:
tc.setCellFactory(new Callback<TableColumn<Trainee, Boolean>, TableCell<Trainee, Boolean>>() {
@Override
public TableCell<Trainee, Boolean> call(TableColumn<Trainee, Boolean> p) {
final CheckBoxTableCell ctCell = new CheckBoxTableCell<>();
ctCell.selectedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue ov, Boolean old_val, Boolean new_val) {
System.out.println(new_val);
}
});
return ctCell;
}
});
1 ответ
selectedProperty
наследуется от Cell
и это просто указывает, является ли Cell
выбран в компоненте пользовательского интерфейса. Поскольку у вас, вероятно, нет выбора ячеек на вашем TableView
ячейка никогда не становится выделенной. Это не то, что вы ищете в любом случае; Вы хотите знать, является ли CheckBox
выбран, а не Cell
,
Хитрость в том, чтобы использовать selectedStateCallback
собственность CheckBoxTableCell
, Это функция, которая отображает индекс ячейки в BooleanProperty
, Тот BooleanProperty
двунаправленно привязан к выбранному состоянию флажка.
Если ваш столбец представляет фактическое свойство в вашем Trainee
класс (я просто позвоню selectedProperty
для демонстрации) тогда вы можете сделать что-то вроде этого:
final CheckBoxTableCell<Trainee, Boolean> ctCell = new CheckBoxTableCell<>();
ctCell.setSelectedStateCallback(new Callback<Integer, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(Integer index) {
return table.getItems().get(index).selectedProperty();
}
});
Тогда недвижимость в Trainee
класс с двунаправленной привязкой к состоянию флажка. Если вам нужно сделать больше, чем просто обновить объект модели, когда флажок установлен / снят, вы можете просто наблюдать это свойство.
Если у вас нет недвижимости в Trainee
класс, вы можете просто создать BooleanProperty
и соблюдайте это:
final CheckBoxTableCell<Trainee, Boolean> ctCell = new CheckBoxTableCell<>();
final BooleanProperty selected = new SimpleBooleanProperty();
ctCell.setSelectedStateCallback(new Callback<Integer, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(Integer index) {
return selected ;
}
});
selected.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> obs, Boolean wasSelected, Boolean isSelected) {
System.out.println(isSelected);
}
});
Как обычно, весь этот код выглядит намного лучше в Java 8.