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 のチェックボックスの 1 つが変更された場合、myCheckBox が選択されないようにする必要があります。

問題は、最初に myCheckBox を選択すると、リスナーがトリガーされ、mTableSteps からいくつかのチェックボックスが選択されることです。ただし、これらのチェックボックスが選択されると、リスナーもトリガーされ、myCheckBox の選択が解除されます。したがって、myCheckBox は常に選択解除されます。

これが理にかなっていることを願っています。これを回避する方法についての提案は大歓迎です。

さらに明確にするために、私が達成しようとしているのは、チェックボックスが選択されたときに mTab​​leSteps の最初の列からいくつかのチェックボックスを選択する myCheckBox のリスナーを用意することです。また、テーブルからチェックボックスを選択/選択解除すると、myCheckBox が選択されていません。どうもありがとう。

4

1 に答える 1

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

それが役立つことを願っています

于 2012-07-11T09:42:40.343 に答える