Discuss / Java / onCheckBoxChanged调用问题 麻烦老师解答

onCheckBoxChanged调用问题 麻烦老师解答

Topic source

里奥08

#1 Created at ... [Delete] [Delete and Lock User]

老师您好 请问下 当只是勾选了checkBoxList中的其中一个checkBox时 为什么会触发了5次onCheckBoxChanged的调用 百思不得其解 求老师能给予解答


    public void onCheckBoxChanged(ChangeEvent event) {

        System.out.println(event.toString());  //增加了打印语句发现调用了

        boolean allChecked = true;

        boolean allUnchecked = true;

        for (var checkBox : checkBoxList) {

            if (checkBox.isSelected()) {

                allUnchecked = false;

            } else {

                allChecked = false;

            }

        }

        selectAll.setEnabled(!allChecked);

        selectNone.setEnabled(!allUnchecked);

    }


打印结果:

...,selectedIcon=,text=Nugget]]

...,selectedIcon=,text=Nugget]]

...,selectedIcon=,text=Nugget]]

...,selectedIcon=,text=Nugget]]

...,selectedIcon=,text=Nugget]]

里奥08

#2 Created at ... [Delete] [Delete and Lock User]

//增加了打印语句发现调用了5次此方法

我也没找到他的触发原因,但我试着改成 actionEvent 实现后发现就只触发一次了。全选和全部取消走自己的处理逻辑不需要进该方法,反选则是手动触发了一次

public record Mediator(        // 复选框列表        List<JCheckBox> checkBoxList,        // 选中所有按钮        JButton selectAll,        // 取消所有按钮        JButton selectNone,        // 反选按钮        JButton selectInverse) {    public Mediator(List<JCheckBox> checkBoxList, JButton selectAll, JButton selectNone, JButton selectInverse) {        // 各个 UI 组件互不引用,这样就减少了组件之间的耦合关系        // Mediator 用于当一个组件发生状态变化时,根据当前所有组件的状态决定更新某些组件        // 如果新增一个 UI 组件,我们只需要修改 Mediator 更新状态的逻辑,现有的其他 UI 组件代码不变        this.checkBoxList = checkBoxList;        this.selectAll = selectAll;        this.selectNone = selectNone;        this.selectInverse = selectInverse;        // 为复选框列表添加状态更改监听器        for (JCheckBox checkBox : this.checkBoxList) {            checkBox.addActionListener(this::onCheckBoxChanged);        }        // 为全选按钮添加动作监听器        this.selectAll.addActionListener(this::onSelectAllClicked);        // 为取消全部按钮添加动作监听器        this.selectNone.addActionListener(this::onSelectNoneClicked);        // 为反选按钮添加动作监听器        this.selectInverse.addActionListener(this::onSelectInverseClicked);    }    /**     * 设置按钮状态     */    public void onCheckBoxChanged(ActionEvent event) {        boolean enableCheckAll = false;        boolean enableUnCheckAll = false;        for (var checkBox : checkBoxList) {            if (checkBox.isSelected()) {                enableUnCheckAll = true;            } else {                enableCheckAll = true;            }        }        selectAll.setEnabled(enableCheckAll);        selectNone.setEnabled(enableUnCheckAll);    }    /**     * 全选     */    public void onSelectAllClicked(ActionEvent event) {        checkBoxList.forEach(checkBox -> checkBox.setSelected(true));        selectAll.setEnabled(false);        selectNone.setEnabled(true);    }    /**     * 取消全部     */    public void onSelectNoneClicked(ActionEvent event) {        checkBoxList.forEach(checkBox -> checkBox.setSelected(false));        selectAll.setEnabled(true);        selectNone.setEnabled(false);    }    /**     * 反选     */    public void onSelectInverseClicked(ActionEvent event) {        checkBoxList.forEach(checkBox -> checkBox.setSelected(!checkBox.isSelected()));        this.onCheckBoxChanged(null);    }}

  • 1

Reply