Как установить хотя бы один флажок в группе?

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


person Tibi    schedule 15.02.2013    source источник


Ответы (1)


Мое решение состояло в том, чтобы использовать пользовательскую группу кнопок:

/**
 * A ButtonGroup for check-boxes enforcing that at least one remains selected.
 * 
 * When the group has exactly two buttons, deselecting the last selected one
 * automatically selects the other.
 * 
 * When the group has more buttons, deselection of the last selected one is denied.
 */
public class ButtonGroupAtLeastOne extends ButtonGroup {

    private final Set<ButtonModel> selected = new HashSet<>();

    @Override
    public void setSelected(ButtonModel model, boolean b) {
        if (b && !this.selected.contains(model) ) {
            select(model, true);
        } else if (!b && this.selected.contains(model)) {
            if (this.buttons.size() == 2 && this.selected.size() == 1) {
                select(model, false);
                AbstractButton other = this.buttons.get(0).getModel() == model ?
                        this.buttons.get(1) : this.buttons.get(0);
                select(other.getModel(), true);
            } else if (this.selected.size() > 1) {
                this.selected.remove(model);
                model.setSelected(false);
            }
        }
    }

    private void select(ButtonModel model, boolean b) {
        if (b) {
            this.selected.add(model);
        } else {
            this.selected.remove(model);
        }
        model.setSelected(b);
    }

    @Override
    public boolean isSelected(ButtonModel m) {
        return this.selected.contains(m);
    }

    public void addAll(AbstractButton... buttons) {
        for (AbstractButton button : buttons) {
            add(button);
        }
    }

    @Override
    public void add(AbstractButton button) {
        if (button.isSelected()) {
            this.selected.add(button.getModel());
        }
        super.add(button);
    }
}

И вот как это использовать:

new ButtonGroupAtLeastOne().addAll(checkBox1, checkBox2)

Все предложения приветствуются.

person Tibi    schedule 15.02.2013
comment
ну, для лучшей помощи, скорее опубликуйте SSCCE, короткий, исполняемый, компилируемый - person mKorbel; 15.02.2013
comment
ну, он короткий, он запускается, компилируется... и мне не нужна помощь - person Tibi; 18.02.2013