繁体   English   中英

CheckBox死循环侦听器

[英]CheckBox dead loop listener

我有以下听众:

        mListener = new ItemListener() {

            public void itemStateChanged(ItemEvent e) {
                if (((JCheckBox) e.getSource()).isSelected()) {
                    setRequired(true);
                } else {
                    setRequired(false);
                }
                getTableSteps().repaint();
            }
        };

        myCheckBox.addItemListener(mListener);

        for (int i = 0; i < mTableSteps.getRowCount(); i++) {
            ((JCheckBox) mTableSteps.getCellRenderer(i, 0)).addItemListener(new ItemListener() {

                public void itemStateChanged(ItemEvent e) {
                    myCheckBox.setSelected(false);
                }
            });
        }

如您所见,myCheckBox是复选框,如果对其进行了修改,则会修改mtablesteps第一栏中的某些复选框(这是在setRequired方法中完成的)。 另外,如果修改了mtablesteps列0中的复选框之一,则应将myCheckBox置于未选中状态。

现在的问题是,当我第一次选择myCheckBox时,它将触发侦听器并从mTableSteps中选择一些复选框。 但是,当选中这些复选框时,它们还会触发其侦听器并取消选择myCheckBox。 因此,myCheckBox总是被取消选择。

我希望这是有道理的。 任何有关如何避免这种情况的建议,我们将不胜感激。

更清楚地说,我要实现的是为myCheckBox配备一个侦听器,当选中该复选框时,它将从mTableSteps的第一列中选​​择一些复选框。 但是,如果我从表中选择/取消选择一个复选框,则会将myCheckBox置于未选中状态。 非常感谢。

您需要某种状态标志,可以用来告诉子侦听器是否应该处理不事件。

mListener = new ItemListener() {

    public void itemStateChanged(ItemEvent e) {
        ignoreUpdates = true
        try {
            if (((JCheckBox) e.getSource()).isSelected()) {
                setRequired(true);
            } else {
                setRequired(false);
            }
            getTableSteps().repaint();
        } finally {
            ignoreUpdates = false;
        }
    }
}

myCheckBox.addItemListener(mListener);

for (int i = 0; i < mTableSteps.getRowCount(); i++) {
    ((JCheckBox) mTableSteps.getCellRenderer(i, 0)).addItemListener(new ItemListener() {
        public void itemStateChanged(ItemEvent e) {
            if (!ignoreUpdates) {
                myCheckBox.setSelected(false);
            }
        }
    });
}

希望能有所帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM