Я поставил два флажка: checkboxDeSelectAll и checkboxSelectAllNotMandatories

Теперь я хочу, чтобы они привязывались таким образом, чтобы, если пользователь проверяет один из них, другой автоматически снимается.

Этот код

checkboxDeSelectAll.selectedProperty().bindBidirectional(checkboxSelectAllNotMandatories.selectedProperty());

Не работает. Если я выберу один, будет выбран и другой.

Могу я сделать что-то подобное?

checkboxDeSelectAll.selectedProperty().bindBidirectional(checkboxSelectAllNotMandatories.selectedProperty().not());

Не работает.. :/

Спасибо за вашу помощь!

2
mrbela 24 Фев 2016 в 18:51

2 ответа

Лучший ответ

Вы можете делать это только со слушателями, насколько мне известно:

checkboxDeSelectAll.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
    if (isNowSelected) {
        checkboxSelectAllNotMandatories.setSelected(false);
    }
});

checkboxSelectAllNotMandatories.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
    if (isNowSelected) {
        checkboxDeSelectAll.setSelected(false);
    }
});
3
James_D 24 Фев 2016 в 16:03

Как и James_D, я бы тоже взял слушателей. И если вы хотите сохранить несколько строк кода, вы можете написать его так:

    Stream.of(fxCb01, fxCb02).forEach(cb -> cb.selectedProperty().addListener((obsVal, oldVal, newVal) -> {
        if (cb.isSelected()) {
            CheckBox otherCb = (cb == fxCb01) ? fxCb02 : fxCb01;
            otherCb.setSelected(false);
        }
    }));

И если вы действительно хотите сохранить несколько нажатий клавиш, вы можете даже заменить cb.isSelected() на newVal.

Я не уверен, что более читабельно. Это дело вкуса.

0
tomorrow 25 Авг 2020 в 18:10