JComboBox()的事件监听类ItemListener。其范例代码如下:
1 import java.awt.*;
2 import java.awt.event.*;
3 import javax.swing.*;
4 public class JComboBoxFrame extends JFrame
5 {
6 private JComboBox cb = new JComboBox();
7
8 public JComboBoxFrame()
9 {
10 cb.addItem("1");
11 cb.addItem("2");
12 cb.addItem("3");
13
14 cb.addItemListener(new ItemListener()
15 {
16 public void itemStateChanged(ItemEvent event)
17 {
18 switch (event.getStateChange())
19 {
20 case ItemEvent.SELECTED:
21 System.out.println("选中" + event.getItem());
22 break;
23 case ItemEvent.DESELECTED:
24 System.out.println("取消选中"+event.getItem());
25 break;
26 }
27 }
28 });
29
30 add(cb);
31 }
32
33 public static void main(String[] args)
34 {
35 JFrame frame = new JComboBoxFrame();
36 frame.pack();
37 frame.setVisible(true);
38 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
39 }
40 }
程序在执行时总是被触发两次。查找了一些资料发现,与ItemListener类中的itemStateChanged()事件的itemState有关,itemState在这里的状态有两个,Selected 和 deSelected(即选中和未被选中),所以,当改变下拉列表中被选中的项的时候,其实是触发了两次事件,第一次是上次被选中的项的 State 由 Selected 变为 deSelected ,即取消选择, 第二次是本次被选中的项的 State 由 deSelected 变为 Selected ,即新选中,所以,必然的 ItemStateChanged 事件中的代码要被执行两次了。
可通过如下方法解决:
if(e.getStateChange() == ItemEvent.SELECTED){ //要执行的代码 } 即为当事件是选中某一项的时候,才执行该代码。
也可以用如下方法:
1 comboBox = new JComboBox();
2 comboBox.addItemListener(new ItemListener() {
3 public void itemStateChanged(final ItemEvent e) {
4 int index = comboBox.getSelectedIndex();
5 if (index != 0) { // ==0表示选中的事第一个
6 String content = comboBox.getSelectedItem().toString();
7 System.out.println("index222="
8 + index + ", content=" + content);
9 }
10 }
11 });