JComboBox事件响应

写在最前

最近一段时间都十分忙,一直没有时间更新这边的文章,好在清明小假期终于能有一段调整的时间了,今日继续。

摘要

对于日常Swing开发,JComboBox添加事件响应是十分常见的工作内容之一。一般来说,常用的手段有addItemListener及addActionListener。那么两者异同在在什么地方?何时该用ItemListener,而又何时该用ActionListener呢?

适用场景

1. 当JComboBox选择内容发生变化时ItemListener会响应2次,而ActionListener会响应1次;
2. 当JComboBox选择内容未发生变化时ItemListener会响应0次,而ActionListener会响应1次;

示例代码:

    JComboBox combox = new JComboBox();
    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适用于不论选中项是否发生变化都需要事件响应的情况;

你可能感兴趣的:(JComboBox事件响应)