2012-07-11 76 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); 
      } 
     } 
    }); 
} 

希望帮助