Designed by Chiyong,?20051
Java2 网络编程基础
AWT 事件模型第七章
Designed by Chiyong,?20052
回顾
抽象窗口工具包( AWT) 是一组类,用来创建图形用户界面,并能够通过键盘和鼠标响应用户的操作。
两种常用容器类:框架( Frame类)和面板
( Panel类)
AWT支持下列类型的组件:标签、文本域、
文本区、按钮、复选框、列表框等。
布局管理器类提供控制 GUI 组件物理布局的一种方式。
Designed by Chiyong,?20053
目标
事件控制的要点
AWT 事件结构
基本事件控制
使用多个监听器
匿名类
Designed by Chiyong,?20054
Java的基于授权的事件模型
Java 最新的事件处理方法是基于授权事件模型
事件源生成事件并将其发送至一个或多个监听器
监听器简单地等待,直到它收到一个事件。
一旦事件被接受,监听器将处理这些事件,
然后返回。
以下内容参照示例 >>
Designed by Chiyong,?20055
事件
在 授权事件模型 中,事件 是一个描述事件源状态改变的对象 。
通过鼠标、键盘与 GUI 界面直接或间接交互都会生成事件。 如:按下一个按钮、
通过键盘输入一个字符、选择列表框中的一项、点击一下鼠标等。
Designed by Chiyong,?20056
事件源 (如:各种组件和容器)是一个生成事件的对象
事件源 是一个对象,它可以注册一个或多个监听器对象,并向 监听器 发送 事件 对象。
一个事件源可能会生成不同类型的事件。
事件源提供了一组方法,用于为事件注册一个或多个 监听器 。
每种事件的类型都有其自己的注册方法。一般形式为:
public void add<EventType>Listener (TypeListener e)
(也 称为向事件源添加监听器)
事件源、监听器和注册监听器
Designed by Chiyong,?20057
监听器接口方法和 awt事件处理过程
1,事件源 描述事件对象中事件的性质。
2,每个事件源都被映射至一个或多个事件 监听器,发生事件时需要调用这些事件 监听器 。
3,事件发生后,事件源将事件对象传递至监听器进行处理。
4,监听器分析 事件对象 找出事件信息,以便根据事件类的类型给出相应的响应(即交给相应的 监听器接口方法 进行处理) 。
Designed by Chiyong,?20058
按钮单击事件示例
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
接口的监听器类实现了 ActionListener接口的
actionPerformed方法,以便根据参数
ActionEvent 事件类对象的信息对事件做出响应为按钮事件注册监听器为事件源添加监听器
Designed by Chiyong,?20059
事件体系结构
FocusEvent
AWTEvent
ActionEvent AdjustmentEvent ComponentEvent TextEventItemEvent
ContainerEvent InputEvent WindowEventPaintEvent
KeyEvent MouseEvent
EventObject
Designed by Chiyong,?200510
AWT 事件类型 2-1
事件类 说明 事件源
ActionEvent 通常按下按钮,双击列表项或选中一个菜单项时,就会生成此事件。
Button,List、
MenuItem、
TextField
AdjustmentEvent 操纵滚动条时会生成此事件。 Scrollbar
ComponentEvent 当一个组件移动、隐藏、调整大小或成为可见时会生成此事件。
Component
ItemEvent 单击复选框或列表项时,或者当一个选择框或一个可选菜单的项被选择或取消时生成此事件。
Checkbox、
CheckboxMenuItem、
Choice,List
FocusEvent 组件获得或失去键盘焦点时会生成此事件。
Component
Designed by Chiyong,?200511
AWT 事件类型 2-2
事件类 说明 事件源
KeyEvent 接收到键盘输入时会生成此事件。 Component
MouseEvent 拖动、移动、单击、按下或释放鼠标或在鼠标进入或退出一个组件时,会生成此事件。
Component
ContainerEvent 将组件添加至容器或从中删除时会生成此事件。
Container
TextEvent 在文本区或文本域的文本改变时会生成此事件 。
TextField、
TextArea
WindowEvent 当一个窗口激活、关闭、失效、
恢复、最小化、打开或退出时会生成此事件。
Window
Designed by Chiyong,?200512
监听器接口
监听器通过实现 java.awt.event 包中定义的一个或多个接口来创建。
在发生事件时,事件源将调用监听器定义的相应方法。
有兴趣接收事件的任何监听器类都必须实现监听器接口。
Designed by Chiyong,?200513
监听器接口列表 2-1
事件监听器 方法
ActionListener actionPerformed
AdjustmentListener adjustmentValueChanged
ComponentListener componentResized
componentMoved
componentShown
componentHidden
ContainerListener componentAdded
componentRemoved
FocusListener focusLost,focusGained
ItemListener itemStateChanged
Designed by Chiyong,?200514
监听器接口列表 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
Designed by Chiyong,?200515
适配器类适配器类 事件监听器接口
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();
}
}
可参看“匿名类”实例
Designed by Chiyong,?200516
任何 GUI 对象的获得或失去焦点都被视为焦点事件,并且事件源必须向事件监听器通知事件对象已失去或已获得焦点。
焦点监听器需要实现两个方法:
focusGained和 focusLost。
要进行错误检查或数据校验时,对焦点的捕捉就显得尤其重要。
焦点事件
Designed by Chiyong,?200517
焦点事件示例
public void focusLost(FocusEvent event) {
if(event.getComponent() == ccField &&
!event.isTemporary()) {
if(!checkFormat(ccField.getText()))
ccField.requestFocus();
}
}
实现了当捕捉到失去焦点事件时如何响应自定义方法,检验失去焦点的组件中的文本格式是否正确如果格式不正确,将焦点移回到该组件
Designed by Chiyong,?200518
窗口事件
当一个窗口被激活、禁止、关闭、正在关闭,最小化、恢复、打开时将生成窗口事件。
需要实现的方法如下:
windowActivated,windowClosed
windowClosing,windowDeactivated
windowDeiconified,windowIconified
windowOpened
Designed by Chiyong,?200519
窗口事件示例
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();
}
}
Designed by Chiyong,?200520
在按下或释放键盘上的一个键时,将生成键盘事件。
keyEvent 类包含用来表示按下或点击的键的常量。
生成 keyEvent 时将调用 keyListener。
如果程序需要处理特殊的键,如方向键,
需要通过调用 keyPressed( ) 方法来处理。
public void keypressed(keyEvent k){
int keyCode = k.getKeyCode();
if ( keyCode == k.VK_RIGHT && k.isShiftDown()){
.,,
}
} 检测用户是否按下了
Shift+右箭头键键盘事件
Designed by Chiyong,?200521
键盘事件示例
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时退出程序
Designed by Chiyong,?200522
任何时候移动、单击、按下或释放鼠标,
都会生成鼠标事件。
鼠标事件有两种监听器,MouseListener
和 MouseMotionListener。
需要实现的方法如下:
MouseListener( 5个)
mouseClicked,mouseEntered,mouseExited
mousePressed,mouseReleased
MouseMotionListener( 2个)
mouseDragged,mouseMoved
鼠标事件
Designed by Chiyong,?200523
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坐标确定单击和双击鼠标事件示例
Designed by Chiyong,?200524
多个监听器
所有 AWT事件源均支持监听器的多点传送模型 。
可以将同一事件发送到多个监听器对象。
需要向一个事件源添加多个监听器,以便使所有注册的监听器都能够对事件源生成的事件作出响应 。
也可用,remove监听器名,的方法删除事件源上的监听器例如,removeActionListener()
Designed by Chiyong,?200525
匿名类
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();
}
});
}
匿名类就是没有指定名称的类
可以便于编写事件处理程序思考:匿名类是否可以生成其它实例
Designed by Chiyong,?200526
总结 2-1
Java最新的事件处理方法是基于授权事件模型。
事件是描述事件源状态变化的对象。用户与 GUI组件交互就会生成事件。
事件源是一个生成(或触发)事件的对象。
当这个对象的内部状态改变时,事件就会发生。
在 Java事件处理中,所有的事件都派生自类 EventObject。 此类是在 java.util包中定义。
Designed by Chiyong,?200527
总结 2-2
java.awt.event 包中有四个语义事件:
ActionEvent,AdjustmentEvent、
ItemEvent,TextEvent。
在发生事件时,事件源将调用监听器定义的相应方法。
适配器类包括所有方法,但不包含功能。