为什么在 JComboBox 上 itemStateChanged 在更改时被调用两次?

2022-09-01 03:36:07

我正在使用带有ItemListener的JComboBox。更改该值时,将调用 itemStateChanged 事件两次。第一次调用时,ItemEvent 显示选定的原始项目。在第二次,它显示用户刚刚选择的项目。下面是一些测试代码:

public Tester(){

    JComboBox box = new JComboBox();
    box.addItem("One");
    box.addItem("Two");
    box.addItem("Three");
    box.addItem("Four");

    box.addItemListener(new ItemListener(){
        public void itemStateChanged(ItemEvent e){
            System.out.println(e.getItem());
        }
    });

    JFrame frame = new JFrame();
    frame.getContentPane().add(box);
    frame.pack();
    frame.setVisible(true);
}

因此,当我将组合框从“一”更改为“三”时,控制台显示:

One
Three

有没有办法让我能使用ItemEvent来判断它是第二个项目(即用户选择的项目)?如果有人能解释为什么它被叫了两次,那也很好!

谢谢


答案 1

看看这个来源:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Tester {

    public Tester(){

        JComboBox box = new JComboBox();
        box.addItem("One");
        box.addItem("Two");
        box.addItem("Three");
        box.addItem("Four");

        box.addItemListener(new ItemListener(){
            public void itemStateChanged(ItemEvent e){
                System.out.println(e.getItem() + " " + e.getStateChange() );
            }
        });

        JFrame frame = new JFrame();
        frame.getContentPane().add(box);
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String [] args) {
        Tester tester = new Tester();
    }
}

使用 getStateChange 确定是选择还是取消选择某个项


答案 2

根据这个线程

当您离开一个结果时,它会被绊倒,然后在设置为另一个结果时再次调用

不要侦听 itemStateChanged。请改用操作管理器,这有利于处理组合的事件。
如果您需要根据所涉及的项目单独处理取消选择/选择,则需要一个 ItemStateListener。

更改 itemState 中项目的状态已更改会导致 itemStateChanged 被触发...这被称为“重新进入”。


推荐