我在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?
答案 0 :(得分:4)
这是因为一个事件是告诉听众一个选项已经取消选择,并且下一个事件告诉另一个选项已经被选中。
您可以通过调用evt.getStateChange()
来确定事件实际引用的内容。它将返回ItemEvent.SELECTED
或ItemEvent.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");
}
});
打印(触发)一次。