CheckBox死循环监听器

时间:2012-07-11 09:18:43

标签: java swing listener jcheckbox itemlistener

我有以下听众:

        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未被选中。非常感谢。

1 个答案:

答案 0 :(得分:0)

你需要某种状态标志,你可以用来告诉儿童听众他们是否应该处理不是的事件。

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);
            }
        }
    });
}

希望有所帮助