当窗口、窗口内的内容、外设等变动的时候,都会产生事件。
Java事件处理三要素:
1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;
2) 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;
3) 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;
1、键盘事件
当向文本框中输入内容时,将发出键盘事件。KeyEvent类负责捕获键盘事件,可以通过为组件添加实现了KeyListener接口的监听器类来处理相应的键盘事件。
KeyListener接口共有三个抽象方法,分别在发生击键事件、按键被按下和释放时被触发。如下面代码所示
JTextArea textArea = new JTextArea();
textArea.addKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) { // 按键被按下时被触发
System.out.println("按下的是“" + e.getKeyChar() + "”");
}
public void keyTyped(KeyEvent e) { // 发生击键事件时被触发
// 获得输入的字符
System.out.println("此次输入的是“" + e.getKeyChar() + "”");
}
public void keyReleased(KeyEvent e) { // 按键被释放时被触发
// 获得描述keyCode的标签
String keyText = KeyEvent.getKeyText(e.getKeyCode());
System.out.println("您释放的是“" + keyText + "”键");
System.out.println();
}
}
常用的方法
2、鼠标事件
所有组件都能发出鼠标事件,MouseEvent类负责捕获鼠标事件,可以通过为组件添加实现了MouseListener接口的监听器类来处理相应的鼠标事件。
MouseListener接口共有5个抽象方法,分别在光标移入或移出组件时、鼠标按键被按下或释放时和发生单击事件时被触发。
final JLabel label = new JLabel();
label.addMouseListener(new MouseListener() {
public void mouseEntered(MouseEvent e) {// 光标移入组件时被触发
System.out.println("光标移入组件");
}
public void mousePressed(MouseEvent e) {// 鼠标按键被按下时被触发
System.out.print("鼠标按键被按下,");
int i = e.getButton(); // 通过该值可以判断按下的是哪个键
if (i == MouseEvent.BUTTON1)
System.out.println("按下的是鼠标左键");
if (i == MouseEvent.BUTTON2)
System.out.println("按下的是鼠标滚轮");
if (i == MouseEvent.BUTTON3)
System.out.println("按下的是鼠标右键");
}
}
public void mouseClicked(MouseEvent e) // 发生单击事件时被触发
public void mouseExited(MouseEvent e) // 光标移出组件时被触发
public void mouseReleased(MouseEvent e) // 鼠标按键被释放时被触发
3、窗体事件
窗体焦点发生变化的事件
// 为窗体添加焦点事件监听器
addWindowFocusListener(new MyWindowFocusListener());
private class MyWindowFocusListener implements WindowFocusListener {
public void windowGainedFocus(WindowEvent e) {// 窗口获得焦点时被触发
System.out.println("窗口获得了焦点!");
}
public void windowLostFocus(WindowEvent e) {// 窗口失去焦点时被触发
System.out.println("窗口失去了焦点!");
}
}
捕获窗体状态发生变化的事件
// 为窗体添加状态事件监听器
addWindowStateListener(new MyWindowStateListener());
private class MyWindowStateListener implements WindowStateListener {
public void windowStateChanged(WindowEvent e) {
int oldState = e.getOldState();// 获得窗体以前的状态
int newState = e.getNewState();// 获得窗体现在的状态
String from = "";// 标识窗体以前状态的中文字符串
String to = "";// 标识窗体现在状态的中文字符串
switch (oldState) {// 判断窗台以前的状态
case Frame.NORMAL:// 窗体处于正常化
from = "正常化";
break;
case Frame.MAXIMIZED_BOTH:// 窗体处于最大化
from = "最大化";
break;
default:// 窗体处于最小化
from = "最小化";
}
}
}
捕获其他与窗体有关的事件
addWindowListener(new MyWindowListener());// 为窗体添加其他事件监听器
private class MyWindowListener implements WindowListener {
public void windowActivated(WindowEvent e) {// 窗体被激活时触发
System.out.println("窗口被激活!");
}
}
public interface WindowListener extends EventListener {
public void windowActivated(WindowEvent e); //窗体被激活时触发
public void windowOpened(WindowEvent e); //窗体被打开时触发
public void windowIconified(WindowEvent e); //窗体被图标化时触发
public void windowDeiconified(WindowEvent e); //窗体被非图标化时触发
public void windowClosing(WindowEvent e); //窗体将要被关闭时触发
public void windowDeactivated(WindowEvent e); //窗体不再处于激活状态时触发
public void windowClosed(WindowEvent e); //窗体已经被关闭时触发
}
4、选项事件
当修改下拉菜单中的选中项时,将发出选项事件。ItemEvent类负责捕获选项事件,可以通过为组件添加实现了ItemListener接口的监听器类来处理相应的选项事件。
JComboBox<String> comboBox = new JComboBox<>();// 创建一个下拉菜单
for (int i = 1; i < 6; i++) {// 通过循环添加选项
comboBox.addItem("选项" + i);
}
comboBox.addItemListener(new ItemListener() {// 添加选项事件监听器
public void itemStateChanged(ItemEvent e) {
int stateChange = e.getStateChange();// 获得事件类型
String item = e.getItem().toString();// 获得触发此次事件的选项
if (stateChange == ItemEvent.SELECTED) {// 查看是否由选中选项触发
System.out.println("此次事件由 选中 选项“" + item + "”触发!");
// 查看是否由取消选中选项触发
} else if (stateChange == ItemEvent.DESELECTED) {
System.out.println("此次事件由 取消选中 选项“" + item + "”触发!");
} else {// 由其他原因触发
System.out.println("此次事件由其他原因触发!");
}
}
});
getContentPane().add(comboBox);
5、表格模型中的事件
当向表格模型中添加行时,或者是修改或删除表格模型中的现有行时,将发出表格模型事件。TableModelEvent类负责捕获表格模型事件,可以通过为组件添加实现了TableModelListener接口的监听器类来处理相应的表格模型事件。
String[] columnNames = { "A", "B" };
String[][] rowValues = { { "A1", "B1" }, { "A2", "B2" },
{ "A3", "B3" }, { "A4", "B4" } };
// 创建表格模型对象
tableModel = new DefaultTableModel(rowValues, columnNames);
// 为表格模型添加事件监听器
tableModel.addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e) {
int type = e.getType();// 获得事件的类型
int row = e.getFirstRow() + 1;// 获得触发此次事件的表格行索引
int column = e.getColumn() + 1;// 获得触发此次事件的表格列索引
if (type == TableModelEvent.INSERT) {// 判断是否有插入行触发
System.out.print("此次事件由 插入 行触发,");
System.out.println("此次插入的是第 " + row + " 行!");
// 判断是否有修改行触发
}
}
}