写在最前
最近一段时间都十分忙,一直没有时间更新这边的文章,好在清明小假期终于能有一段调整的时间了,今日继续。
摘要
对于日常Swing开发,JComboBox添加事件响应是十分常见的工作内容之一。一般来说,常用的手段有addItemListener及addActionListener。那么两者异同在在什么地方?何时该用ItemListener,而又何时该用ActionListener呢?
适用场景
1. 当JComboBox选择内容发生变化时ItemListener会响应2次,而ActionListener会响应1次;
2. 当JComboBox选择内容未发生变化时ItemListener会响应0次,而ActionListener会响应1次;
示例代码:
JComboBox<String> combox = new JComboBox<String>();
combox.addItem("AAA");
combox.addItem("BBB");
combox.addItem("CCC");
combox.addItemListener(e -> System.out.println("itemStateChanged"));
combox.addActionListener(e -> System.out.println("actionPerformed"));
现象:
当第一次选择“BBB”时,输出为:
itemStateChanged
itemStateChanged
actionPerformed
当再一次选择“BBB”时,输出为:
actionPerformed
进一步分析
替换实例代码如下:
combox.addItemListener(e -> System.out.println(e));
combox.addActionListener(e -> System.out.println(e));
重复上述操作,当第一次选择“BBB”时,输出为:
java.awt.event.ItemEvent[ITEM_STATE_CHANGED,item=AAA,stateChange=DESELECTED] on javax.swing.JComboBox[,0,0,196x74,layout=com.apple.laf.AquaComboBoxUI$AquaComboBoxLayoutManager,alignmentX=0.0,alignmentY=0.0,border=,flags=16777536,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=AAA]
java.awt.event.ItemEvent[ITEM_STATE_CHANGED,item=BBB,stateChange=SELECTED] on javax.swing.JComboBox[,0,0,196x74,layout=com.apple.laf.AquaComboBoxUI$AquaComboBoxLayoutManager,alignmentX=0.0,alignmentY=0.0,border=,flags=16777536,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=BBB]
java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=comboBoxChanged,when=1490977820123,modifiers=Button1] on javax.swing.JComboBox[,0,0,196x74,layout=com.apple.laf.AquaComboBoxUI$AquaComboBoxLayoutManager,alignmentX=0.0,alignmentY=0.0,border=,flags=16777536,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=BBB]
当再一次选择“BBB”时,输出为:
java.awt.event.ActionEvent[ACTION_PERFORMED,cmd=comboBoxChanged,when=1490977820123,modifiers=Button1] on javax.swing.JComboBox[,0,0,196x74,layout=com.apple.laf.AquaComboBoxUI$AquaComboBoxLayoutManager,alignmentX=0.0,alignmentY=0.0,border=,flags=16777536,maximumSize=,minimumSize=,preferredSize=,isEditable=false,lightWeightPopupEnabled=true,maximumRowCount=8,selectedItemReminder=BBB]
看到这里,响应次数区别的原因就一目了然了,之所以当选择项发生变化时ItemListener会响应2次的原因为:
1. 当ItemEvent为DESELECTED及SELECTED时,ItemListener各响应了一次;
2. 当ActionEvent的comboBoxChanged时ActionListener一定会响应一次的。
总结
ItemListener及ActionListener两者的异同如下:
- 相同处:ItemListener ActionListener都是JCombobox的事件响应Listener;
- 不同处
- 选中项改变时ItemListener响应2次,选中项不变时ItemListener响应0次;
- 选中项改变时ActionListener响应1次,选中项不变时ActionListener响应1次;
- ItemListener适用于因stateChange不同而进行不同事件响应的情况;
- ActionListener适用于不论选中项是否发生变化都需要事件响应的情况;