WindowBuilder联动JComboBox选中城市触发区县ActionListener问题咨询
问题根因
JComboBox的ActionListener的触发规则是只要选中项发生变更就会触发,不区分变更是用户手动操作触发还是代码主动调用API修改触发。你在城市下拉的回调中对区县下拉框的多个操作都会触发它的选中项变更,所以才会意外触发回调,具体触发点如下:
- 调用
countyBox.removeAllItems()清空原有选项时,原有选中项被移除,选中状态发生变更,首次触发区县的ActionListener - 调用
countyBox.setSelectedItem("Select county")主动设置选中值时,选中项发生变更,第二次触发回调 - 后续循环调用
countyBox.addItem()添加区县选项时,如果新增的选项触发了选中状态更新(比如可编辑模式下临时选中值匹配到了新增选项、或者清空后首次添加选项默认被选中),会第三次触发回调
可选修复方案
如果要避免代码修改下拉选项时触发回调,可以在修改区县下拉选项前临时移除它的ActionListener,修改完成后再重新绑定:
// 先把区县监听器单独定义保存 ActionListener countyListener = new ActionListener() { public void actionPerformed(ActionEvent e) { // 原来的区县回调逻辑 } }; countyBox.addActionListener(countyListener); // 城市下拉回调中修改区县选项前临时移除监听器 cityBox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { countyBox.removeActionListener(countyListener); try { // 原有清空选项、添加区县选项、设置选中项的逻辑放在这里 if (cityBox.getSelectedItem().equals("Istanbul")) { countyBox.removeAllItems(); hospitalBox.removeAllItems(); String istanbul[] = cities.getIstanbul(); for (int i = 0; i < istanbul.length; i++) countyBox.addItem(istanbul[i]); countyBox.setSelectedItem("Select county"); comboClinic.setSelectedItem("Select clinic"); } // 其余城市的处理逻辑同理 } finally { // 操作完成后重新加回监听器,保证用户手动选择时能正常触发 countyBox.addActionListener(countyListener); } } });
内容的提问来源于stack exchange,提问作者userandnuser
相关产品推荐
相关产品推荐

