Version 3.0
AWT 事件模型第七章
2
回顾
抽象窗口工具包( AWT) 是一组类,用来创建图形用户界面,并能够通过键盘和鼠标响应用户的操作。
两种常用容器类:框架( Frame类)和面板
( Panel类)
AWT支持下列类型的组件:标签、文本域、
文本区、按钮、复选框、列表框等。
布局管理器类提供控制 GUI 组件物理布局的一种方式。
3
目标
事件控制的要点
AWT 事件结构
基本事件控制
使用多个监听器
匿名类
4
事件控制的要点
Java 最新的事件处理方法是基于授权事件模型
事件源生成事件并将其发送至一个或多个监听器
监听器简单地等待,直到它收到一个事件。
一旦事件被接受,监听器将处理这些事件,
然后返回。
5
事件
在 授权事件模型 中,事件是一个描述事件源状态改变的对象 。
通过鼠标、键盘与 GUI 界面直接或间接交互都会生成事件。 如:按下一个按钮、
通过键盘输入一个字符、选择列表框中的一项、点击一下鼠标等。
6
事件源
事件源是一个生成事件的对象
一个事件源可能会生成不同类型的事件
事件源提供了一组方法,用于为事件注册一个或多个监听器。
每种事件的类型都有其自己的注册方法。
一般形式为:
public void add<EventType>Listener (TypeListener e)
7
AWT采取的事件控制过程
监听器对象属于一个类的实例,这个类实现了一个特殊的接口,名为“监听者接口”
事件源是一个对象,它可以注册一个或多个监听器对象,并向其发送事件对象。
事件源将在发生事件时向所有注册的监听器发送事件对象。
监听器对象使用事件对象中的信息来确定它们对事件的响应。
8
按钮单击事件示例
public class MyEventTest extends Panel {
Button myButton = new Button("蓝色 ");
.,,// 创建面板或其他 GUI 组件
MyListener myAction = new MyListener();
MyButton.addActionListener(myAction);
private class MyListener implements ActionListener {
public MyListener() {
.,,// 初始化
}
public void actionPerformed(ActionEvent event) {
.,,//需要为事件进行的操作
}
}
}
实现了 ActionListener
接口的监听器实现了 actionPerformed方法,
以便根据参数 ActionEvent 对象的信息对事件做出响应为按钮事件注册监听器
9
事件体系结构
FocusEvent
AWTEvent
ActionEvent AdjustmentEvent ComponentEvent TextEventItemEvent
ContainerEvent InputEvent WindowEventPaintEvent
KeyEvent MouseEvent
EventObject
10
AWT 事件类型 2-1
事件类 说明 事件源
ActionEvent 通常按下按钮,双击列表项或选中一个菜单项时,就会生成此事件。
Button,List、
MenuItem、
TextField
AdjustmentEvent 操纵滚动条时会生成此事件。 Scrollbar
ComponentEvent 当一个组件移动、隐藏、调整大小或成为可见时会生成此事件。
Component
ItemEvent 单击复选框或列表项时,或者当一个选择框或一个可选菜单的项被选择或取消时生成此事件。
Checkbox、
CheckboxMenuItem、
Choice,List
FocusEvent 组件获得或失去键盘焦点时会生成此事件。
Component
11
AWT 事件类型 2-2
事件类 说明 事件源
KeyEvent 接收到键盘输入时会生成此事件。 Component
MouseEvent 拖动、移动、单击、按下或释放鼠标或在鼠标进入或退出一个组件时,会生成此事件。
Component
ContainerEvent 将组件添加至容器或从中删除时会生成此事件。
Container
TextEvent 在文本区或文本域的文本改变时会生成此事件 。
TextField、
TextArea
WindowEvent 当一个窗口激活、关闭、失效、
恢复、最小化、打开或退出时会生成此事件。
Window
12
监听器接口
监听器通过实现 java.awt.event 包中定义的一个或多个接口来创建。
在发生事件时,事件源将调用监听器定义的相应方法。
有兴趣接收事件的任何监听器类都必须实现监听器接口。
13
监听器接口列表 2-1
事件监听器 方法
ActionListener actionPerformed
AdjustmentListener adjustmentValueChanged
ComponentListener componentResized
componentMoved
componentShown
componentHidden
ContainerListener componentAdded
componentRemoved
FocusListener focusLost,focusGained
ItemListener itemStateChanged
14
监听器接口列表 2-2
事件监听器 方法
KeyListener keyPressed,keyReleased
keyTyped
MouseListener mouseClicked,mouseEntered
mouseExited,mousePressed
mouseReleased
MouseMotionListener mouseDragged,mouseMoved
TextListener textChanged
WindowListener windowActivated,windowDeactivated
windowClosed,windowClosing
windowIconified,windowDeiconified
windowOpened
15
适配器类适配器类 事件监听器接口
ComponentAdapter ComponentListener
ContainerAdapter ContainerListener
FocusAdapter FocusListener
KeyAdapter KeyListener
MouseAdapter MouseListener
MouseMotionAdapter MouseMotionListener
WindowAdapter WindowListener
为了使事件处理变得简单,Java 为具有多个方法的监听器接口提供适配器类。适配器类实现并提供了一个事件监听器接口中的所有的方法,
但这些方法都是空方法。
private class MyMouseAdapter extends MouseAdapter {
private Color bgColor;
public MyMouseAdapter (Color c){ bgColor = c; }
public void mouseClicked(MouseEvent mevent){
setBackground(bgColor); repaint();
}
}
16
事件源、监听器和监听器接口
事件源描述事件对象中事件的性质。
每个事件源都被映射至一个或多个事件监听器,发生事件时需要调用这些事件监听器。
事件源随后通过将事件对象传递至监听器接口类的方法,将事件信息发送到监听器接口。
监听器分析事件对象找出事件信息,以便给出响应 。
17
任何 GUI 对象的获得或失去焦点都被视为焦点事件,并且事件源必须向事件监听器通知事件对象已失去或已获得焦点。
焦点监听器需要实现两个方法:
focusGained 和 focusLost。
要进行错误检查或数据校验时,对焦点的捕捉就显得尤其重要。
焦点事件
18
焦点事件示例
public void focusLost(FocusEvent event) {
if(event.getComponent() == ccField &&
!event.isTemporary()) {
if(!checkFormat(ccField.getText()))
ccField.requestFocus();
}
}
实现了当捕捉到失去焦点事件时如何响应检验失去焦点的组件中的文本格式是否正确如果格式不正确,将焦点移回到该组件
19
窗口事件
当一个窗口被激活、禁止、关闭、正在关闭、
最小化、恢复、打开时将生成窗口事件。
需要实现的方法如下:
windowActivated,windowClosed
windowClosing,windowDeactivated
windowDeiconified,windowIconified
windowOpened
20
窗口事件示例
class MyFrame extends Frame {
boolean w;
public MyFrame() {
w=false;
setTitle("测试适配器类 ");
setSize(300,200);
MyPanel panel = new MyPanel();
add(panel);
addWindowListener(new MyWindowAdapter());
}
private class MyWindowAdapter extends WindowAdapter{
public void windowClosing(WindowEvent wevent){
if(w) dispose();
else System.exit(0);
}
}
}
实现了 windowClosing
方法,以响应窗口关闭时的事件
import java.awt.*;
import java.awt.event.*;
public class MyAdapterDemo{
public static void main(String[] args) {
MyFrame frm = new MyFrame();
frm.show();
}
}
21
在按下或释放键盘上的一个键时,将生成键盘事件。
keyEvent 类包含用来表示按下或点击的键的常量。
生成 keyEvent 时将调用 keyListener。
如果程序需要处理特殊的键,如方向键,
需要通过调用 keyPressed( ) 方法来处理。
键盘事件
public void keypressed(keyEvent k){
int keyCode = k.getKeyCode();
if ( keyCode == k.VK_RIGHT && k.isShiftDown()){
.,,
}
} 检测用户是否按下了
Shift+右箭头键
22
键盘事件示例
class MyPanel extends Panel {
public MyPanel() {
TextField tField = new TextField(20);
add(tField);
MyKeyAdapter bAction = new MyKeyAdapter();
tField.addKeyListener(bAction);
}
private class MyKeyAdapter extends KeyAdapter {
public void keyPressed(KeyEvent kevent){
setBackground(Color.blue); repaint(); }
public void keyReleased(KeyEvent kevent) {
setBackground(Color.red); repaint(); }
public void keyTyped(KeyEvent kevent) {
if (kevent.getKeyChar() == 'x') System.exit(0); }
}
}
按下键时背景变为兰色,
释放键时背景变为红色,
输入字符 x时退出程序
23
鼠标事件
任何时候移动、单击、按下或释放鼠标,
都会生成鼠标事件。
鼠标事件有两种监听器,MouseListener
和 MouseMotionListener。
需要实现的方法如下:
mouseClicked,mouseEntered,mouseExited
mousePressed,mouseReleased
mouseDragged,mouseMoved
24
public void mouseClicked(MouseEvent m){
int x = m.getX();
int y = m.getY();
int clickCount = m.getClickCount();
if(clickCount == 2){
Graphics g = getGraphics();
g.drawString("鼠标双击! ",x,y);
g.dispose();
}
}
鼠标事件示例获得点击鼠标时鼠标指针的 x及 y坐标确定单击和双击
25
多个监听器
所有 AWT事件源均支持监听器的多点传送模型 。
可以将同一事件发送到多个监听器对象。
需要向一个事件源添加多个监听器,以便使所有注册的监听器都能够对事件源生成的事件作出响应 。
26
匿名类
class MyPanel extends Panel {
public MyPanel() {
Button bButton = new Button("蓝色 ");
add(bButton);
bButton.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mevent){
setBackground(Color.blue);
repaint();
}
});
}
匿名类就是没有指定名称的类
可以便于编写事件处理程序
27
总结 2-1
Java最新的事件处理方法是基于授权事件模型。
事件是描述事件源状态变化的对象。用户与 GUI组件交互就会生成事件。
事件源是一个生成(或触发)事件的对象。
当这个对象的内部状态改变时,事件就会发生。
在 Java事件处理中,所有的事件都派生自类
EventObject。 此类是在 java.util包中定义。
28
总结 2-2
java.awt.event 包中有四个语义事件:
ActionEvent,AdjustmentEvent,ItemEvent、
TextEvent。
在发生事件时,事件源将调用监听器定义的相应方法。
适配器类包括所有方法,但不包含功能。