我有以下听众:
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 :(得分: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);
}
}
});
}
希望有所帮助