当我们从comboBox或下拉列表中选取一项时,其实自动产生了2个Item Event事件。Item Event有几个方法,这些方法在这2个事件上有不同意义。
一、ItemEvent的构造方法
ItemEvent(ItemSelectable source, int id, Object item, int stateChange)
ItemSelectable source: 产生事件的源
Object item: 被影响的item (先是指被去选择DESELECTED的项,再指当前选择SELECTED的项)
int stateChange: 每一个ItemEvent对象取下面2个值中的一个:
ItemEvent.DESELECTED、ItemEvent.SELECTED
二、ItemEvent的其它方法的使用
举例说明:设有一个comboBox,含有items: {"A", "B", "C", "D", "E"}。
假如当前亮显"B"项,现在选择"C",则会连续自动产生2个ItemEvent事件,从而连续回调itemStateChanged(ItemEvent itemEvent) 二次:第一次对应的itemEvent事件是“B is deselected”,第二次对应的itemEvent事件是“C is selected”。
针对这2个不同的事件,ItemEvent的各个方法的作用如下表:
itemStateChanged(ItemEvent itemEvent)中 调用下列方法 | 事件1:"B"被去选 deselected | 事件2:"C"被选中 selected | 解释 |
itemEvent.getItem() | B | C | 返回被影响的item |
itemEvent.getStateChange() | DESELECTED | SELECTED | 返回被影响的方式:去选择/选择 |
itemEvent.getItemSelectable().getSelectedObjects()[0] | C | C | 返回产生事件的源 |
itemEvent.getSource(): 从java.util.EventObject类继承的方法 | javax***Reminder=B] | javax***Reminder=C] | 返回产生事件的源,但是很长 |
三、上述例子的源程序
GetItemSelectableDemo.java:
import java.awt.BorderLayout;
import java.awt.ItemSelectable;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class GetItemSelectableDemo {
public static void main(final String args[]) {
final String labels[] = { "A", "B", "C", "D", "E" };
JFrame frame = new JFrame("Selecting JComboBox");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JComboBox comboBox = new JComboBox(labels);
frame.add(comboBox, BorderLayout.SOUTH);
ItemListener itemListener = new ItemListener() {
public void itemStateChanged(ItemEvent itemEvent) {
int state = itemEvent.getStateChange();
String stateString = ((state == ItemEvent.SELECTED) ? "Selected" : "Deselected");
System.out.println("Item: " + itemEvent.getItem());
System.out.println(", State: " + stateString);
ItemSelectable is = itemEvent.getItemSelectable();
System.out.println(", Selected: " + selectedString(is));
System.out.println(", Source: " + itemEvent.getSource()); // 很长:Source: javax.swing***selectedItemReminder=A]
/* 也可以不用上面所有的ItemEvent的方法,而用容器combox的getSelectedItem方法,但是有2条要注意:
1. 良好的模块化设计尽量减少模块之间的耦合,所以尽量不使用该方法以外的变量。
2. 上面的匿名inner class使用的外面的变量comboBox必须是final的,这样comboBox就不能动态修改或增加了。
*/
System.out.println(" (Item: " + comboBox.getSelectedItem() + " selected)");
}
};
comboBox.addItemListener(itemListener);
frame.setSize(400, 200);
frame.setVisible(true);
}
static private String selectedString(ItemSelectable is) {
Object selected[] = is.getSelectedObjects();
return ((selected.length == 0) ? "null" : (String)selected[0]);
}
}
/* 亮显B时,选择C的输出结果:
Item: B
, State: Deselected
, Selected: C
(Item: C selected)
Item: C
, State: Selected
, Selected: C
(Item: C selected)
*/
// 参考 src: http://www.java2s.com/Tutorials/Java/java.awt.event/ItemEvent/Java_ItemEvent_getItemSelectable_.htm