Java:myComboBoxItemStateChanged被触发两次?

时间:2011-01-21 11:19:37

标签: java swing

我在JDialog上放置了一个JComboBox,然后通过NetBeans设计视图,我将JComboBox绑定到一个事件函数Events>项目> itemStateChanged

private void myComboBoxItemStateChanged(ItemEvent evt) {//created by netbeans
     System.out.println("triggered");
}

当我通过myComboBox.setSelectedIndex(#)更改comboBox时,它调用myComboBoxItemStateChanged()一次,但是如果我通过单击comboBox并选择另一个项来更改它,它会触发myComboBoxItemStateChanged()两次!它打印“触发”两次?

我的所有组合框中都出现了这个问题!

我做错了什么?还是一个bug?

2 个答案:

答案 0 :(得分:4)

这是因为一个事件是告诉听众一个选项已经取消选择,并且下一个事件告诉另一个选项已经被选中

您可以通过调用evt.getStateChange()来确定事件实际引用的内容。它将返回ItemEvent.SELECTEDItemEvent.DESELECTED

如果您将"triggered"更改为"triggered " + evt.getStateChange(),则会看到它会打印的差异

triggered 2
triggered 1

因此,如果您只对选择了某些内容的事件感兴趣,您可以添加到您的侦听器实现的顶部

if (evt.getStateChange() == ItemEvent.DESELECTED)
    return;

以下是the docs on getStateChange()的摘录:

  

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

     

返回:一个整数,指示项目是被选中还是取消选择

答案 1 :(得分:0)

你可以这样做:

jComboBox.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                        System.out.println("triggered");
                }
        });

打印(触发)一次。