38

我正在使用带有 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 来判断它是第二个项目(即用户选择的项目)?如果有人能解释为什么它会被调用两次,那就太好了!

谢谢

4

10 回答 10

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

使用 getStateChange 确定是否选择或取消选择项目

于 2008-12-01T11:50:46.607 回答
20

根据这个线程

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

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

在 itemStateChanged 中更改项目的状态会导致 itemStateChanged 被触发……这称为“重入”。

于 2008-12-01T11:55:32.480 回答
16

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

        comboBox1.addItemListener(new ItemListener() {
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == ItemEvent.SELECTED) {
                    comboBox1ItemStateChanged();
                }
            }
        });
于 2012-01-08T23:57:19.857 回答
7

哟可以这样做:

import java.awt.event.*;

jComboBox1.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Hello");
        }
    });
于 2009-07-22T19:09:26.363 回答
7
private void dropDown_nameItemStateChanged(java.awt.event.ItemEvent evt) {                                                 


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

}

祝你好运!

于 2013-12-12T06:15:34.017 回答
3

代码是:

public class Tester {

    private JComboBox box;

    public Tester() {

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

        box.addItemListener(new ItemListener() {

            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == 1) {

                    JOptionPane.showMessageDialog(box, e.getItem());
                    System.out.println(e.getItem());
                }
            }
        });

        JFrame frame = new JFrame();
        frame.getContentPane().add(box);
        frame.pack();
        frame.setVisible(true);
    }
}
于 2011-05-13T11:49:42.547 回答
3

看这里,

box.addItemListener(new ItemListener(){
    public void itemStateChanged(ItemEvent e){
        if(e.getStateChange()== ItemEvent.SELECTED) {
            //this will trigger once only when actually the state is changed
            JOptionPane.showMessageDialog(null, "Changed");
        }
    }
});

当你选择一个新的选项时,它只会调用一次 JOptionPane,表示那里的代码只会被调用一次。

于 2017-05-31T08:51:02.457 回答
1

引用Java 教程

“一次只能在组合框中选择一个项目,因此当用户进行新选择时,先前选择的项目将变为未选择。因此,每次用户从菜单中选择不同的项目时都会触发两个项目事件。如果用户选择相同的项目,不会触发任何项目事件。”

于 2015-03-26T11:17:50.427 回答
0
  1. 当从组合框中选择任意项时,它会在内部触发选择更改,即它会调用函数setSelectedItem。
  2. 如果实现了显式 itemStateChanged 事件侦听器,则 setSelectedItem 将调用 itemStateChanged。因此,当一个项目被选中时,它调用 setSelectedItem 然后它调用 itemStateChanged。
  3. 随着组合框的值发生变化,即使这样也会触发 itemStateChanged 并因此调用 itemStateChanged。
  4. 我已经为项目更改编写了监听器,以处理从代码内部设置时组合框值的变化,这导致函数被调用两次。

这是 2 个回溯,当从组合框中选择一个值时会调用它。

第一次实际值变化:

dataMgr.MainInterface.jComboBoxPaymentStatusValueChangeHandle(MainInterface.java:1431), 
dataMgr.MainInterface.jComboBoxPaymentStatusItemStateChanged(MainInterface.java:1676), 
dataMgr.MainInterface.access$600(MainInterface.java:28), 
dataMgr.MainInterface$7.itemStateChanged(MainInterface.java:437), 
javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223), 
javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1271), 
javax.swing.JComboBox.contentsChanged(JComboBox.java:1330), 
javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118), 
javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93), 
javax.swing.JComboBox.setSelectedItem(JComboBox.java:576), javax.swing.JComboBox.setSelectedIndex(JComboBox.java:622), javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:852), java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290), java.awt.Component.processMouseEvent(Component.java:6533), javax.swing.JComponent.processMouseEvent(JComponent.java:3324), javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:501), java.awt.Component.processEvent(Component.java:6298), java.awt.Container.processEvent(Container.java:2236), java.awt.Component.dispatchEventImpl(Component.java:4889), java.awt.Container.dispatchEventImpl(Container.java:2294), java.awt.Component.dispatchEvent(Component.java:4711), java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888), java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525), java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466), java.awt.Container.dispatchEventImpl(Container.java:2280), java.awt.Window.dispatchEventImpl(Window.java:2746), java.awt.Component.dispatchEvent(Component.java:4711), java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758), java.awt.EventQueue.access$500(EventQueue.java:97), java.awt.EventQueue$3.run(EventQueue.java:709), java.awt.EventQueue$3.run(EventQueue.java:703), java.security.AccessController.doPrivileged(Native Method), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86), java.awt.EventQueue$4.run(EventQueue.java:731), java.awt.EventQueue$4.run(EventQueue.java:729), java.security.AccessController.doPrivileged(Native Method), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), java.awt.EventQueue.dispatchEvent(EventQueue.java:728), java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201), java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116), java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93), java.awt.EventDispatchThread.run(EventDispatchThread.java:82)]

第二次由于对组合框的操作

dataMgr.MainInterface.jComboBoxPaymentStatusValueChangeHandle(MainInterface.java:1431), 
dataMgr.MainInterface.jComboBoxPaymentStatusItemStateChanged(MainInterface.java:1676), 
dataMgr.MainInterface.access$600(MainInterface.java:28), 
dataMgr.MainInterface$7.itemStateChanged(MainInterface.java:437), 
javax.swing.JComboBox.fireItemStateChanged(JComboBox.java:1223), 
javax.swing.JComboBox.selectedItemChanged(JComboBox.java:1280), 
javax.swing.JComboBox.contentsChanged(JComboBox.java:1330), 
javax.swing.AbstractListModel.fireContentsChanged(AbstractListModel.java:118), 
javax.swing.DefaultComboBoxModel.setSelectedItem(DefaultComboBoxModel.java:93), 
javax.swing.JComboBox.setSelectedItem(JComboBox.java:576), 
javax.swing.JComboBox.setSelectedIndex(JComboBox.java:622), 
javax.swing.plaf.basic.BasicComboPopup$Handler.mouseReleased(BasicComboPopup.java:852), 
java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:290), 
java.awt.Component.processMouseEvent(Component.java:6533), 
javax.swing.JComponent.processMouseEvent(JComponent.java:3324), 
javax.swing.plaf.basic.BasicComboPopup$1.processMouseEvent(BasicComboPopup.java:501), 
java.awt.Component.processEvent(Component.java:6298), java.awt.Container.processEvent(Container.java:2236), 
java.awt.Component.dispatchEventImpl(Component.java:4889), java.awt.Container.dispatchEventImpl(Container.java:2294), 
java.awt.Component.dispatchEvent(Component.java:4711), java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888), 
java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525), java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466), 
java.awt.Container.dispatchEventImpl(Container.java:2280), java.awt.Window.dispatchEventImpl(Window.java:2746), 
java.awt.Component.dispatchEvent(Component.java:4711), java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758),
java.awt.EventQueue.access$500(EventQueue.java:97), java.awt.EventQueue$3.run(EventQueue.java:709), 
java.awt.EventQueue$3.run(EventQueue.java:703), java.security.AccessController.doPrivileged(Native Method),
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), 
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86), 
java.awt.EventQueue$4.run(EventQueue.java:731), java.awt.EventQueue$4.run(EventQueue.java:729), 
java.security.AccessController.doPrivileged(Native Method), java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76), java.awt.EventQueue.dispatchEvent(EventQueue.java:728), java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201), java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116), java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101), java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93), java.awt.EventDispatchThread.run(EventDispatchThread.java:82)]
于 2016-12-23T03:39:10.533 回答
-4

JComboBox.setFocusable(false)会成功的。

于 2010-12-22T07:37:16.277 回答