我正在使用带有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告诉它,它是第二项(即用户选择的项目)?如果有人可以解释为什么它被调用两次,那也会很好!
谢谢
我的代码实际上非常简单.我看到了一个简单而类似的代码是从这篇文章.
起初,我有1个组合框.我有一个名为itemStateChanged()的监听器.我加入这个监听器的目的是:" 当用户从其保管箱中点击(选择)一个项目时执行一些代码 ".
Cmb_ItemCategory = new javax.swing.JComboBox();
Cmb_ItemCategory.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Loading..." }));
Cmb_ItemCategory.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
Cmb_ItemCategoryItemStateChanged(evt);
}
});
private void Cmb_ItemCategoryItemStateChanged(java.awt.event.ItemEvent evt) {
if(evt.getStateChange() == java.awt.event.ItemEvent.SELECTED){
System.err.println("Sombody click or change my model content");
}
}
Run Code Online (Sandbox Code Playgroud)
在代码后面,我获取一些数据,然后调用removeAllItems()方法.然后我将新模型(从新数据)设置到其中.
-- at another line of code ---
Cmb_ItemCategory.removeAllItems();
Cmb_ItemCategory.setModel(newModel);
Run Code Online (Sandbox Code Playgroud)
我juz意识到当我执行removeAllItem()方法时调用了我的itemStateChanged().叫了一次.
那么,如何使它只调用一次用户单击(选择)而不是当removeAllItems()调用时?
它类似于这篇文章.但它不是removeItems案例.CMIIW.