`
xy0792
  • 浏览: 90633 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

KDComboBox/JComboBox选择事件执行2次问题

 
阅读更多

在监听KDComboBox的时候,代码总是执行2次,这个原因一直没找到,当时也懒的深究,以为是控件的Bug。

 

comboBox.addItemListener(new ItemListener() {

			public void itemStateChanged(ItemEvent e) {
				comboBox_itemStateChanged(e);
			}
		});
protected void comboBox_itemStateChanged(ItemEvent e) {
		System.out.println("comboBox");
}

 

 执行结果:

comboBox

comboBox

 

可以通过调试,明显知道执行了2次逻辑。

 

以前的解决方案:

 

ItemListener listener;//定义类变量
//监听
 listener = new ItemListener() {

			public void itemStateChanged(ItemEvent e) {
				comboBox_itemStateChanged(e);
			}
		};

comboBox.addItemListener(listener);

//方法:
comboBox_itemStateChanged(ItemEvent e){
    System.out.println("comboBox");
    comboBox.removeItemListener(listener);
    comboBox.addItemListener(listener);
}

 

 以上方法并不科学,执行了一次之后将listener remove,然后再添加listener,当时并不了解comboBox_itemStateChanged的逻辑,导致很多代码都这样写了。今天看到一篇文章,才知道这样写是错误的。

 

在JComboBox的监听事件时总是执行两次,原因如下:

ItemListener类中的方法itemStateChanged()事件的itemState有关,itemState在这里的状态有两个,Selected 和 deSelected(即选中和未被选中)

所以,当改变下拉列表中被选中的项的时候,其实是触发了两次事件:

第一次是上次被选中的项的 State 由 Selected 变为 deSelected ,即取消选择

第二次是本次被选中的项的 State 由 deSelected 变为 Selected ,即新选中,所以,必然的 ItemStateChanged 事件中的代码要被执行两次了。加上最外面的if语句,就可以解决这个问题。

 

简单理解,当下拉框从item1下拉选择item2的时候,相当于 item1从Selected->deSelected ,item2从deSelected-Selected,使用才执行了2次,知道了原因之后,发现以前的代码写的多么不规范了,害死人啊。

ComboBox后台的实现可能是item1、item2都是CheckBox,下拉事件item1状态从选中变成取消执行一次,item2由取消状态变成选中状态执行一次导致的。

 

 

解决方法如下

 

	protected void comboBox_itemStateChanged(ItemEvent e) { 
		if (e.getStateChange() == ItemEvent.SELECTED
				&& e.getSource() == comboBox) {
			System.out.println("comboBox");
		}
	}

 

e.getSource() == comboBox//这个判断也能省略的,如果没有多个comboBox公用一个监听

 

	protected void comboBox_itemStateChanged(ItemEvent e) { 
		if (e.getStateChange() == ItemEvent.SELECTED) {
			System.out.println("comboBox");
		}
	}
分享到:
评论

相关推荐

    java JComboBox的事件处理

    Java的JComboBox是一个非常有用的组件,它允许用户在下拉列表中选择一个或多个选项。在GUI编程中,处理JComboBox的事件是提高用户交互性和应用程序功能的关键部分。本篇文章将深入探讨Java中JComboBox的事件处理机制...

    java 建立可自行输入的JComboBox

    在实际应用中,我们还可以为`JComboBox`添加事件监听器,以便在用户选择或输入新值时执行相应的操作。例如,我们可以监听`ActionEvent`,当用户按下回车键或者从下拉列表中选择一个选项时触发: ```java comboBox....

    JComboBox动态绑定数据库

    为了实现动态绑定,通常会在用户操作`JComboBox`时触发事件,如选择变更,然后根据新的选择重新查询数据库并更新组件。例如,使用`ActionListener`监听选择事件: ```java comboBox.addActionListener(e -> { ...

    java JComboBox的使用

    Java `JComboBox` 是 Swing 组件库中的一个控件,用于在下拉列表中显示一组可选择的选项。它提供了一个简单的用户界面,允许用户从预定义的选项中进行单选。`JComboBox` 在 Java 图形用户界面(GUI)编程中非常常见...

    JComboBox下拉框多选

    在Java Swing库中,`JComboBox`通常用于创建下拉列表,它允许用户从一组预定义的选项中选择一个。然而,默认情况下,`JComboBox`只支持单选操作。但根据你的需求,我们可以通过自定义组件来实现多选功能。在标题...

    JComboBox级联

    在本示例中,主要通过监听`JComboBox`的选择变化事件,并根据选择结果动态创建新的`JComboBox`来实现级联效果。具体来说,当用户在一个`JComboBox`中做出选择后,程序会触发级联逻辑,创建新的`JComboBox`并将其添加...

    oracle jdk自带swing 代码示例swingset3

    swing入门必看示例( oracle 官方swingset3示例) swingset3-oracle 运行包, 双击...基本组件:ToggleButtons/JButton/JComboBox/ProgressBar/Slider/Spinner/TextFeild/JEditorPane 选择器:JColorChooser/JOptionPane

    用JComboBox和JList实现的一个文件浏览器组件

    2. 组件间的交互:通过`ActionListener`或`ItemListener`监听`JComboBox`的选择事件,当选择改变时触发`JList`的更新。 3. 模型管理:对于`JComboBox`,我们可以使用`DefaultComboBoxModel`来存储文件夹路径;对于`...

    java 实现下拉列表JComboBox中值和显示不同

    下拉列表 JComboBox 是 Java 中的一种 GUI 组件,用于提供用户选择多个选项。通常情况下,我们需要在 JComboBox 中显示一组选项,而实际上选项的值却不同于显示的文字。这时,我们可以自定义一个类,实现 ...

    自动过滤的JComboBox

    支持自动过滤可选项的JComboBox 支持键盘选择、鼠标选择

    swing组件JComboBox

    #### 二、创建JComboBox实例 创建`JComboBox`实例的方法很简单: ```java Object[] mark = {"Option1", "Option2", "Option3"}; // 选项数组 JComboBox<String> jComboBox = new JComboBox(mark); // 创建...

    java 建立有图像的JComboBox

    在Java编程中,`JComboBox` 是Swing库中用于创建下拉选择框的组件,它允许用户从一组预定义的选项中进行选择。当需要为`JComboBox`添加图像时,可以创建自定义的组合框模型,将每个选项与对应的图片关联起来,以提供...

    JComboBox With JCheckBox

    在Java Swing库中,`JComboBox`和`JCheckBox`是两种常见的组件,它们分别用于创建下拉选择框和复选框。`JComboBox`提供了一个可扩展的列表,用户可以从中选择一个或多个选项,而`JCheckBox`则允许用户在一组选项中...

    Java Swing JComboBox下拉列表框的示例代码

    Java Swing JComboBox 下拉列表框是一种常用的 GUI 组件,它允许用户从多个选项中选择一个值。下面将详细介绍 JComboBox 的基本概念、常用构造方法、常用方法和示例代码。 JComboBox 的基本概念 JComboBox 是一个...

    中国省市区三级联动的JCombobox源代码

    - Java Swing提供了事件监听机制,开发者可以注册监听器到`JComboBox`,在用户做出选择时触发相应事件,如`ItemListener`或`ActionListener`,从而更新其他联动的下拉框。 5. **XML数据存储**: - 标签提到XML...

    Swing-JComboBox.zip_JComboBox_JComboBox qq

    在Java GUI编程中,`JComboBox`是Swing库中一个重要的组件,它用于创建具有下拉选择功能的控件。在默认情况下,`JComboBox`的外观可能并不符合所有用户的审美,尤其是在早期版本的Java中,其设计相对简单且略显陈旧...

    java 利用ComboModel构造JComboBox

    在Java编程中,`JComboBox` 是Swing库中的一个组件,用于创建下拉选择框。这个组件允许用户从预定义的一组选项中选择一个。` ComboModel` 是`JComboBox`的核心,它管理着下拉列表中的所有数据。本教程将深入探讨如何...

    Swing之JTable+JComboBox的详细介绍[zone yan]

    `JTable`用于展示二维表格数据,而`JComboBox`则是一种下拉选择框,可以提供多个选项供用户选择。在某些场景下,我们可能需要在`JTable`的某一列中嵌入`JComboBox`,以实现更加灵活的数据输入方式。本篇将详细介绍...

    Jtable JCombobox例子

    在Java Swing中,`JTable`是一个非常重要的组件,用于展示二维数据,而`JComboBox`则是一个下拉选择框,常用于提供多种选择给用户。当你需要在`JTable`的某一列中嵌入可选择的下拉列表时,`JComboBox`就派上了用场。...

    (完整版)Java程序设计任务驱动式教程-任务二十-选择之道(使用选择控件和选择事件).ppt

    【Java程序设计任务驱动式教程】的第20章,"选择之道",主要讲解了在Java GUI编程中如何使用选择控件和处理选择事件,以实现用户交互。这一章节涵盖了多个关键知识点: 1. **选择控件**: - **JComboBox**: 用于...

Global site tag (gtag.js) - Google Analytics