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

Nic*_*cks 36 java swing jcombobox itemlistener

我正在使用带有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);
}
Run Code Online (Sandbox Code Playgroud)

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

One
Three
Run Code Online (Sandbox Code Playgroud)

有没有一种方法我可以使用ItemEvent告诉它,它是第二项(即用户选择的项目)?如果有人可以解释为什么它被调用两次,那也会很好!

谢谢

kgi*_*kis 31

看看这个来源:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 忽略事件并查看实际状态是一般的好习惯. (2认同)

Von*_*onC 16

根据这个帖子,

当你离开一个结果时它会被触发,然后在设置为另一个结果时再次被调用

不要听itemStateChanged.请改用ActionListener,这对处理组合事件很有用.
如果需要根据所涉及的项目单独处理取消选择/选择,则需要ItemStateListener.

更改itemStateChanged中项目的状态会导致itemStateChanged被触发...这称为"reentrance".

  • 请注意,如果用户选择与之前选择的值相同的值,则仍会触发 `ActionListener`,而 `ItemListener` 不会发生这种情况。 (2认同)

qiz*_*zer 13

我想在选择后获取索引字符串并在组合框中设置

        comboBox1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED) {
                    comboBox1ItemStateChanged();
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)


小智 7

哟可以这样做:

import java.awt.event.*;

jComboBox1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Hello");
        }
    });
Run Code Online (Sandbox Code Playgroud)


小智 5

private void dropDown_nameItemStateChanged(java.awt.event.ItemEvent evt) {                                                 


    if(evt.getStateChange() == ItemEvent.SELECTED)
    {
        String item = (String) evt.getItem();
        System.out.println(item);
    }

}
Run Code Online (Sandbox Code Playgroud)

祝好运!