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

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


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

我的所有组合框中都发生了此问题!

我究竟做错了什么?还是一个错误?

最佳答案

这是因为一个事件是告诉侦听器已取消选择一个选项,而另一个事件是告诉侦听器已选择另一个选项。

您可以通过调用evt.getStateChange()来了解事件实际指的是什么。它将返回ItemEvent.SELECTEDItemEvent.DESELECTED

如果将"triggered"更改为"triggered " + evt.getStateChange(),您将看到与打印相同的区别

triggered 2
triggered 1


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

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


这是the docs on getStateChange()的片段:


  返回状态更改的类型(选中或取消选中)。
  
  返回:一个整数,指示是否已选择或取消选择该项

10-08 02:47