9、JcomboBox下拉框事件监听

9、JcomboBox下拉框事件监听


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     });
原文地址:https://www.cnblogs.com/hthuang/p/3468262.html