寫在最前
最近一段時間都十分忙图柏,一直沒有時間更新這邊的文章刻蟹,好在清明小假期終于能有一段調(diào)整的時間了午衰,今日繼續(xù)。
摘要
對于日常Swing開發(fā)眷篇,JComboBox添加事件響應(yīng)是十分常見的工作內(nèi)容之一萎河。一般來說,常用的手段有addItemListener及addActionListener蕉饼。那么兩者異同在在什么地方虐杯?何時該用ItemListener,而又何時該用ActionListener呢昧港?
適用場景
1. 當(dāng)JComboBox選擇內(nèi)容發(fā)生變化時ItemListener會響應(yīng)2次擎椰,而ActionListener會響應(yīng)1次;
2. 當(dāng)JComboBox選擇內(nèi)容未發(fā)生變化時ItemListener會響應(yīng)0次创肥,而ActionListener會響應(yīng)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"));
現(xiàn)象:
當(dāng)?shù)谝淮芜x擇“BBB”時,輸出為:
itemStateChanged
itemStateChanged
actionPerformed
當(dāng)再一次選擇“BBB”時叹侄,輸出為:
actionPerformed
進一步分析
替換實例代碼如下:
combox.addItemListener(e -> System.out.println(e));
combox.addActionListener(e -> System.out.println(e));
重復(fù)上述操作巩搏,當(dāng)?shù)谝淮芜x擇“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]
當(dāng)再一次選擇“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]
看到這里贯底,響應(yīng)次數(shù)區(qū)別的原因就一目了然了,之所以當(dāng)選擇項發(fā)生變化時ItemListener會響應(yīng)2次的原因為:
1. 當(dāng)ItemEvent為DESELECTED及SELECTED時撒强,ItemListener各響應(yīng)了一次禽捆;
2. 當(dāng)ActionEvent的comboBoxChanged時ActionListener一定會響應(yīng)一次的。
總結(jié)
ItemListener及ActionListener兩者的異同如下:
- 相同處:ItemListener ActionListener都是JCombobox的事件響應(yīng)Listener飘哨;
- 不同處
- 選中項改變時ItemListener響應(yīng)2次胚想,選中項不變時ItemListener響應(yīng)0次;
- 選中項改變時ActionListener響應(yīng)1次杖玲,選中項不變時ActionListener響應(yīng)1次;
- ItemListener適用于因stateChange不同而進行不同事件響應(yīng)的情況淘正;
- ActionListener適用于不論選中項是否發(fā)生變化都需要事件響應(yīng)的情況摆马;