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.

Другие вопросы по тегам