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     });

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3278
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5228
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2850
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3005
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

38610
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏魂祭心

原 canvas绘制clock

5094
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5767
来自专栏hbbliyong

WPF Trigger for IsSelected in a DataTemplate for ListBox items

<DataTemplate DataType="{x:Type vm:HeaderSlugViewModel}"> <vw:HeaderSlug...

4214
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3692

扫码关注云+社区