事件的概念
Java的事件处理采用委托型(Delegation)事件监听处理机制,在此机制中组件(事件源)将事件委托给一个特定的对象(事件监听器),当组件产生指定的事件时,就通知所委托的事件监听器来处理这个事件。在事件处理过程中,主要涉及以下几个概念:
1.Event——事件,用户对界面操作在Java语言上的描述,以类的形式出现,例如键盘操作对应的事件类是KeyEvent。
2.Event Source——事件源,当用户与GUI程序交互时,会触发相应的事件,而能产生事件的组件称为事件源,如按钮等。
3.Event Handler——事件处理者,接收事件对象并对其进行处理的对象。
如果用户用鼠标单击了按钮对象JButton,则该按钮就是事件源,即产生事件的根源,而Java运行系统会自动生成ActionEvent事件类的对象e,该对象中描述了事件发生时的一些信息,然后事件处理者对象将接收由Java运行时系统传递过来的事件对象e并进行相应的处理。
4.监听器对象:触发事件后系统会自动创建事件类的对象,组件本身不会处理事件,而是将事件对象提交给Java运行系统,系统将事件对象委托给专门的监听器对象,例如用户如果希望对单击按钮事件进行处理,可以给事件源(按钮)注册一个事件监听器,这如同签订了一个委托合同。
由于在同一个事件源上可能发生多种事件,因此事件源可以把在其自身所有可能发生的事件分别授权给不同的事件处理者来处理。比如在画布对象(Canvas)上即可能发生鼠标事件,也可能发生键盘事件,该Canvas对象就可以授权给事件处理者1处理鼠标事件,同时授权给事件处理者2处理键盘事件。授权模型把事件和处理委托给外部的处理实体进行处理,实现了将事件源和监听器分开的机制。事件处理者(监听器)通常是一个类,该类如果要能够处理某种类型的事件,就必须实现与该事件类型权对应的接口。
事件类和事件监听者
在Swing编程中依然使用AWT的事件处理方式,AWT事件类都放在Java.awt.event包中,而和AWT有关的所有事件类都由AWTEvent类派生。具体事件类的层次如图所示。

这些AWT事件分为两大类:低级事件和高级事件。低级事件是指基于构件和容器的事件,在一个构件上发生事件,如鼠标的进入、点击、拖放,或构件上的窗口开关等,高级事件是基于语义的事件,它可以不和特定的运作相关联,而依赖于触发此事件的类,如在TextField中按Enter键,或是选中项目列表中的某一选项就会触发ActionEvent事件。
1.低级事件
ComponentEvent——构件尺寸的变化、移动
ContainerEvent——容器事件,构件增加,移动
WindowEvent——窗口事件,关闭窗口,窗口闭合,图标化
FocusEvend——焦点事件,焦点的获得和丢失
KeyEvent——键盘事件,键按下,释放
MouseEvent——鼠标事件,鼠标单击,移动
2.高级事件(语义事件)
ActionEvent——动作事件,按钮按下或文本框中的按下回车键产生
AdjustmentEvent——调节事件,用户在滚动条上移动滑块产生
ItemEvent——项目事件,选择项等产生
TextEvent——文本事件,文本对象的改变
不同的事件由不同的事件监听,每一种事件都对应有其事件监听器接口,有些事件还有其对应的适配器类:
| 事件类型 | 接口名 | 接口的方法及产生事件的操作 | 适配器类 |
| ActionEvent | ActionListener | ActionPerformed(ActionEvent)单击按钮,文本行中单击左键,双击列表框选项时产生 |
|
| ItemEvent | ItemListener | ItemStateChange(ItemEvent)选择复选框、选项框、单击列表框、选中带复选框的菜单时产生 |
|
| MouseEvent | MouseMotionListener | MouseDragged(MouseEvent)拖拽鼠标时 MouseMoved(MouseEvent)移动鼠标时产生 | MouseMotionAdater |
| MouseListener | MosePressed(MouseEvent)按下鼠标时产生 MouseReleased(MouseEvent)释放鼠标时产生 MouseEntered(MouseEvent)鼠标进入时产生 MouseExited(MouseEvent)鼠标离开时产生 MouseClicked(MoserEvent)单击鼠标时产生 | MouseAdapter |
| KeyEvent | KeyListener | KeyPressed(KeyEvent)按下键盘,KeyReleased(KeyEvent)释放键盘,KeyTyped(KeyEvent)键盘可峁字符时产生 | KeyAdapter |
| FocusEvent | FocusListener | FocusGained(FocusEvent)获得焦点时,FocusLost(focusEvent)失去焦点时产生 | FocusAdapter |
| AdjustmentE-vent | AdjustmentListener | AdjustmentValueChanged(AdjustmentEvent)滚动滑块位置发生改变时产生 |
|
| ComponentEv-ent | ComponentListener | ComponentMoved(ComponentEvent)移动组件时产生 ComponentHidden(ComponentEvent)隐藏组件时产生 ComponentResized(ComponentEvent)改变组件大小时产生 ComponentShown(ComponentEvent)显示组件时产生 | ComponentAdapter |
| WindowEvent | WindosListener | WindowClosing(WindowEvent)关闭窗口时产生 WindowOpened(WindowEvent)打开口后产生 WindowIconified(WidowEvent)窗口图标化时产生 WindowDeiconified(WindowEvent)取消窗口图标化时产生 WindowClosed(WindowEvent)关闭窗口后产生 WindowActivated(WindowEvent)激活窗口时产生 WindowDeactivated(WindowEvent)窗口失去焦点时产生 | WindowAdapter |
| ContainerEv-ent | ContainerListener | CompinentAdded(comtainerEvent)添加给件时产生 ComponentRemoved(comtainerEvent)移动给件时产生 | ContainerAdapter |
| TextEvent | TextListener | TextValueChanged(TextEvent)文本行、文本框中修改内容时产生 |
|
java.awt.event包中定义了十一个监听接口,每个接口内部包含了若干处理相关事件的抽象方法,一般说来,每个事件类都有一个监听者接口与之相对应,而事件类中的每个具体事件类型都有一个具体的抽象方法与之对应,当具体事件发生时,这个事件将被封装成一个事件类的对象作为实际参数传递给与之对应的具体方法,由这个具体方法负责响应并处理发生的事件。
事件编程的步骤
Java应用程序使用所谓委托型事件监听的事件处理机制来处理事件。在这种模型中有两个角色,分别是:生成事件的组件对象(事件源头)和处理事件的对象。处理事件的对象包含处理事件的代码。这种模型最显著的特征如下:
任何组件都可以是事件的源头,例如按钮可以是某个动作事件的来源。
任何类都可以是事件的监听器,只要它实现了正确的监听器接口。
源对象生成的事件只发送给已经在源对象中注册的那些监听器。
在程序中编写事件处理的程序代码段时,通常可以分为以下三个步骤:
1.确定组件及产生事件的类型
2.增加事件监听器
3.编写事件处理程序
完成以上两步后,就可以编写事件处理的代码了,也就是事件的处理程序。
在JFrame窗体中加入按钮组件并处理动作事件
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUIDemo3 implements ActionListener {
JTextArea ta = new JTextArea(6, 40);
JButton lab = new JButton("按钮");
public GUIDemo3() {
JFrame fr = new JFrame("事件处理");
fr.add(ta, BorderLayout.CENTER);
fr.add(lab, BorderLayout.SOUTH);
lab.addActionListener(this);
Dimension d = new Dimension(230, 150);
fr.setSize(d);
fr.setBackground(Color.WHITE);
Point p = new Point(300, 200);
fr.setLocation(p);
fr.setVisible(true);
}
public void actionPerformed(ActionEvent e) {
ta.append("单击了按钮\n");
}
public static void main(String[] args) {
new GUIDemo3();
}
}
