Java 当选择列表项时,JoptionPane显示两次

Java 当选择列表项时,JoptionPane显示两次,java,swing,jcombobox,itemlistener,Java,Swing,Jcombobox,Itemlistener,当我单击JComboBox的某个项目以显示包含所选项目文本的JoptionPane时,它会显示两次。如何取消激活项目侦听器事件 import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.*; public class Combo implements ItemListener { JFrame f; JComboBox cb; Combo() {

当我单击JComboBox的某个项目以显示包含所选项目文本的JoptionPane时,它会显示两次。如何取消激活项目侦听器事件

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

public class Combo implements ItemListener {

    JFrame f;
    JComboBox cb;

    Combo() {
        f = new JFrame("Combo ex");

        String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"};

        cb = new JComboBox(country);
        cb.setBounds(50, 50, 90, 20);
        f.add(cb);
        cb.addItemListener(this);
        f.setLayout(null);
        f.setSize(400, 500);
        f.setVisible(true);

    }

    public static void main(String[] args) {
        new Combo();

    }

    @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getSource()==cb) {
            String seleccionado=(String)cb.getSelectedItem();
            JOptionPane.showMessageDialog(f, seleccionado);
        }
    }
}

您希望避免重写itemStateChanged()。在itemStateChanged中更改项的状态会导致激发itemStateChanged。。。这就是为什么你会看到两次对话。您应该改用ActionListener

例如,我稍微修改了您的代码。它现在应该只显示一个对话框

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


public class Combo{

    JFrame frame;
    JComboBox cb;

    Combo() {
        frame = new JFrame("Combo ex");

        String country[] = {"India", "Aus", "U.S.A", "England", "Newzeland"};

        cb = new JComboBox(country);
        cb.setBounds(50, 50, 90, 20);
        cb.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                String seleccionado=(String)cb.getSelectedItem();
                JOptionPane.showMessageDialog(frame, seleccionado);
            }
        });
        frame.add(cb);
        frame.setLayout(null);
        frame.setSize(400, 500);
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        new Combo();

    }

}

问题是,
itemStateChanged()
在用户选择或取消选择项目时被调用。简单来说,当您选择一个新项目时,您也会取消选择旧项目

试试这个:

if (e.getSource()==cb && e.getStateChange() == ItemEvent.SELECTED) { 
    //
}

getStateChange(),返回状态更改的类型(已选择或取消选择)。

它工作正常。你能解释一下这行代码吗