2012-07-11 108 views
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它會觸發監聽器,並從mTableSteps中選擇一些複選框。但是當這些複選框被選中時,它們也會觸發它們的監聽器並取消選擇myCheckBox。因此,myCheckBox總是被取消選擇。

我希望這是有道理的。任何建議如何避免這一點表示讚賞。

爲了更加清晰,我試圖實現的是myCheckBox的偵聽器,當選中該複選框時,它將從mTableSteps的第一列中選​​擇一些複選框。但是,如果我從表中選擇/取消選擇複選框,它會將myCheckBox置於未選中狀態。非常感謝。

回答

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

希望幫助