[英]CheckBox dead loop listener
我有以下听众:
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置于未选中状态。 非常感谢。
您需要某种状态标志,可以用来告诉子侦听器是否应该处理不事件。
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);
}
}
});
}
希望能有所帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.