JAVA JComboBox的监听事件(ActionListener、ItemListener)
来源:互联网 发布:eppendorf移液器淘宝 编辑:程序博客网 时间:2024/05/22 13:54
参考资料:
http://263229365.iteye.com/blog/1040329
https://www.java.net/node/650758
https://community.oracle.com/thread/2332288?start=0&tstart=0
问题的产生:
在看JComboBox组件的监听事件时,运行讲解到的实例(增加了几个输出语句来跟踪它的反应)碰到下面的问题:
1, JComboBox组件在添加了ActionListener和ItemListener监听器时, 两个监听器都对JComboBox值的改变做出了相应的操作。
2, 尤其是ActionListener的事件处理,不管怎么样都始终执行了两次。。。。
(1)运行下面的程序代码:
(2)查看运行结果:
Option 1: 从下拉列表里面选择一个值
Option 2: 直接键盘输入一个值
可以发现,如果此时在JComboBox同时加入ItemListener和 ActionListener的话,两个监听器都会做出相应的动作(并且ActionEvent做出了两次反应 twice)!!!
分析:
1, 如果在覆些ItemListener的itemStateChanged方法中的判断去掉的话,ItemListener同样也会做出两次动作!!第一次是前一个值的DESELECTED触发;第二次是后一个值的SELECTED触发。 这里通过判断触发源的StateChange来进行过滤,只对后一次值的SELECTED做出动作!!!!!
- ItemListener接口中定义的itemStateChanged(ItemEvent e)将执行需要在已选定(或已取消选定)项时发生的操作;
- 上次被选中的项的State由SELECTED变为DESELECTED,即取消选择;
- 本次选中的项的State由DESELECTED变为SELECTED,即新选中;
- itemStateChanged()事件与itemState有关!!!itemState在这里有两个状态,Selected和Ddselected
所以itemStateChanged事件中的代码要被执行两次!!!!!!
2, https://www.java.net/node/650758
查看JComboBox的源代码例子,对于JComboBox有个actionCommand的String存在!!!其可能的两个值“comboBoxChanged”和“comboBoxEdited”被hardcoded到源码里面了。同样也造成了有两个ActionPerformed产生了。
对于有两个actionPerformed产生,有以下解决方案:
Step1, 保存上次选定项的值
Step2, 仅对选项值是新(新选项并且该选项的值不等于上次选定项的值)的事件进行捕获
3,针对ActionListener,因为与两次的输出是当actionCommand的值分别是comboBoxChanged和comboBoxEdited做出reaction。
由于actionCommand的值是String类型,所以只需要do a simple equals test 就可以了。。修改actionPerformed(ActionEvent e)方法如下就可以过滤掉comboBoxEdited的触发事件了
还有另外一种解决方案来自 https://community.oracle.com/thread/2332288?start=0&tstart=0 同学
但是好像,上面的这个editor监听器的方案不好处理啊。还是我没有找到正确的处理方法~~~它失去了监听JComboBox组件 这一最初始的目的啊~~~~~~~~~
4,JComboBox is a little bit different than other components, because there are two actions, you shouldn't set the command, instead you should check them, as follows.
if ("comboBoxEdited".equals(evt.getActionCommand()))
else if ("comboBoxChanged".equals(evt.getActionCommand()))
总结
1,ActionListener是所有监听器的父类,其他监听器可以监听的事件都可以被它捕获
2, ItemListener用于捕获带Item的组件产生的事件,抽象方法itemStateChanged(ItemEvent e)执行需要在已选定(或已取消选定)项时发生的操作
3, (仔细查看event事件)ActionListener报告的2个不同的事件: 一个是编辑文本框 comboBoxEdited,另外一个是选定值 comboBoxChanged。
问题的解决:
1, 网上有人说针对JComboBox一般添加ItemListener监听器即可 (ActionListener是所有监听器的父类,其他监听器可以监听的事件都可以被ActionListener捕获)
2, 通过对ActionEvent的actionCommand值的判断,来过滤掉不需要的监听事件。 例如,我们只需要捕获值的改变(actionCommand = comboBoxChanged)。
3, 增加一点ItemListener监听器的事件的过滤,是通过事件的 getStateChanged()的值(它只有两个值: ItemEvent.SELECTED 和 ItemEvent.DESELECTED)来判断的。
- JAVA JComboBox的监听事件(ActionListener、ItemListener)
- JAVA JComboBox的监听事件(ActionListener、ItemListener)
- JAVA JComboBox的监听事件(ActionListener、ItemListener)
- swing的ItemListener的监听事件
- java中gui编程ActionListener和itemListener
- 事件监听 ActionListener
- JComboBox事件监听
- ActionListener ItemListener 和几个SWING组件的练习
- AWT 事件监听Demo ActionListener
- ***P381(动作监听事件ActionListener接口)
- JComboBox 的监听
- Java Swing事件处理——行为事件及监听处理 ActionListener和内部类
- JComboBox的事件处理:
- 9、JcomboBox下拉框事件监听
- [乐意黎原创] JComboBox ItemListener监听器
- GUI 事件监听模型 Button的addActionListener(ActionListener l)方法很关键
- j2se使用ActionListener实现界面上按钮点击的事件监听操作
- Java的一点收获(1)JComboBox
- awk 时间选取
- new和delete的用法
- 李超树 学习笔记
- Django项目之小博客
- HTTP协议结构
- JAVA JComboBox的监听事件(ActionListener、ItemListener)
- 业余时间决定了你的人生
- 欢迎使用CSDN-markdown编辑器
- Java进阶之虚拟机《五》:多态性实现机制--静态分派与动态分派
- bzoj1055 [HAOI2008]玩具取名(区间)
- LCD主流显示接口介绍
- Keras导入数据集报'NpzFile' object has no attribute 'zip'错误解决方案
- IDEA中使用MyBaits的配置问题
- 将电脑已连接过的wifi及密码保存到桌面脚本