java - 如何计算选中的复选框总数?如果(总共选择的)>10 则禁用休息

标签 java checkbox arraylist

所以我试图检查选中的复选框总数是否 == 10。如果是这样,我想禁用其余未选中的复选框!这意味着用户只能选择 10 个复选框。

我正在考虑一个 for 循环,它循环遍历一个数组,然后检查是否选中了复选框,然后将 1 添加到计数器。如果计数器达到 10,我认为禁用其余复选框可能很容易,但显然不是!

          List<Checkbox> chkSongs = new ArrayList<Checkbox>();
            String labels[] = {"songA", "songB", "songC", "songD", "songE",
                "songF", "songG", "songH", "songI", "songJ", "songK", "songL", "songM",
            "songN", "songO", "songP", "songQ", "songR", "songS", "songT"}
            for (int i = 0; i < labels.length; i++) {
                Checkbox checkbox = new Checkbox(labels[i]);
                chkSongs.add(checkbox); 
                formPanel.add(checkbox);
            } 

最佳答案

这是我临时写的,但我认为它可以满足您的要求:

public class CheckBoxFrame extends JFrame {

    public CheckBoxFrame() throws HeadlessException {
        JPanel formPanel = new JPanel(new GridLayout(-1, 4));
        List<Checkbox> chkSongs = new ArrayList<>();
        String labels[] = {"songA", "songB", "songC", "songD", "songE",
                           "songF", "songG", "songH", "songI", "songJ", "songK", "songL", "songM",
                           "songN", "songO", "songP", "songQ", "songR", "songS", "songT"};
        for (String label : labels) {
            Checkbox checkbox = new Checkbox(label);
            chkSongs.add(checkbox);
            formPanel.add(checkbox);
        }
        CheckBoxListener listener = new CheckBoxListener(chkSongs, 10);
        setContentPane(formPanel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
    }

    public class CheckBoxListener implements ItemListener {

        private int boxesChecked;
        private final List<Checkbox> checkBoxes;
        private final int maxSelections;

        public CheckBoxListener(List<Checkbox> checkBoxes, int maxSelections) {
            this.checkBoxes = new ArrayList<>(Objects.requireNonNull(checkBoxes));
            this.maxSelections = maxSelections;
            this.boxesChecked = (int) this.checkBoxes.stream().filter(cb -> cb.getState()).count();
            this.checkBoxes.forEach(cb -> cb.addItemListener(this));
        }

        @Override
        public void itemStateChanged(ItemEvent ie) {
            if (ie.getStateChange() == ItemEvent.SELECTED) {
                boxesChecked++;
            } else {
                boxesChecked--;
            }

            if (boxesChecked == maxSelections) {
                checkBoxes.stream().filter(cb -> !cb.getState()).forEach(cb -> cb.setEnabled(false));
            } else if (boxesChecked == maxSelections - 1) {
                checkBoxes.stream().forEach(cb -> cb.setEnabled(true));
            }
        }

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new CheckBoxFrame().setVisible(true);
            }

        });
    }

}

这仍然有其缺陷(例如,您可以将监听器添加到另一个复选框),但还不错。

关于java - 如何计算选中的复选框总数?如果(总共选择的)>10 则禁用休息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30641116/

相关文章:

java - Eclipse 和 maven-war-plugin 爆炸式增长

javascript - 如果选中复选框,则显示表单的其余部分

ruby-on-rails - Rails 4 字符串复选框从不返回空数组

java - 用homebrew安装bazel的问题

java - Android调用页面返回JSON错误

java - 如何先按值排序 Map 条目,然后按键排序并将排序的键放入列表中?

html - 在下拉多个复选框中选择最后 3 个复选框中的任何一个时打开一个新的文本字段

java - Android - 包裹自定义类型 - 失败的 BINDER 交易

java - 如何根据您所在的 Activity 从 CustomAdapter 隐藏元素?

android - 将 ArrayList 保存到 SharedPreferences