0

我有以下听众:

        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 时,它会触发侦听器并从 mTab​​leSteps 中选择一些复选框。但是当这些复选框被选中时,它们也会触发它们的监听器并取消选择 myCheckBox。因此, myCheckBox 总是被取消选中。

我希望这是有道理的。任何有关如何避免这种情况的建议表示赞赏。

To be more even more clear, what I'm trying to achieve is have a listener for myCheckBox which when the checkbox is selected it will select some of the checkboxes from the first column of mTab​​leSteps. 而且,如果我从表中选择/取消选择一个复选框,它会将 myCheckBox 置于未选中状态。非常感谢。

4

1 回答 1

0

You need some kind of state flag that you can use to tell the child listeners if they should process the event of not.

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

Hope that helps

于 2012-07-11T09:42:40.343 回答