我开始制作一个小应用程序,用户需要从组合框中选择他们的省,我在组合框中添加了一个动作监听器。我想测试ActionListener
所以我只是将它打印到控制台上。出于某种原因,似乎我得到了两次返回的组合框的值。例如,我在组合框中选择“Alberta”,将“Alberta Alberta”打印到控制台。任何人都知道为什么会这样?
JComboBox comboProv = new JComboBox(provinces);
comboProv.setBounds(40, 79, 137, 24);
contentPane.add(comboProv);
comboProv.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
String selectedProv = (String)comboProv.getSelectedItem();
System.out.print(selectedProv);
}
});
答案 0 :(得分:2)
您没有添加ActionListener
,添加ItemListener
,ItemListener
会在值更改时通知两次,一次针对ItemEvent.DESELECTED
事件和一次对于ItemEvent.SELECTED
。
如果您对选择更改不感兴趣,只需使用ActionListener
comboProv.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String selectedProv = (String)comboProv.getSelectedItem();
System.out.print(selectedProv);
}
});
只会通知一次
避免使用null
布局,像素完美布局是现代ui设计中的一种幻觉。影响组件个体大小的因素太多,您无法控制。 Swing旨在与布局管理器一起工作,放弃这些将导致问题和问题的终结,您将花费越来越多的时间来纠正
答案 1 :(得分:1)
把它放在监听器中..它打印了两次,因为它被调用selected
和deselected
..所以将它添加到过滤器
if (e.getStateChange() == ItemEvent.SELECTED) {
String selectedProv = (String)comboProv.getSelectedItem();
System.out.print(selectedProv);.
} else if(e.getStateChange() == ItemEvent.DESELECTED){
//Do any operations you need to do when an item is de-selected.
}