JavaSE第七十九讲:AWT事件模型深入详解

1. AWT事件模型

课程目标
1) 编写代码来处理在图形用户界面中发生的事件
2) 描述Adapter类的概念,包括如何和何时使用它们
3) 根据事件对象的细节来确定产生事件的用户动作
4) 为各种类型的事件创建合适的接口和事件处理器

2.什么是事件

1) 事件------描述发生了什么的对象 [事件与异常类似,是由一个个类构成的,当一个事件产生的时候,实际上是由对应的那个事件的类来生成了一个对象,这个对象封装了与这个事件相关的信息,我们可以通过这个对象获取到事件相关的信息]
2) 事件源------事件的产生器 [比如说是一个按钮]
3) 事件处理器------接收事件、解释事件并处理用户交互的方法[注意是一个方法]

      如果用户在用户界面层执行了一个动作(鼠标点击和按键),这将导致一个事件的发生。事件是描述发生了什么的对象。存在各种不同类型的事件类用来描述各种类型的用户交互。

3. 事件源

事件源是一个事件的产生者。例如,在Button组件上点击鼠标会产生以这个Button 为源的一个ActionEvent[可以理解为JDK给我们提供的鼠标点击按钮产生的事件,这个事件是ActionEvent这个类的对象]. 这个ActionEvent实例是一个对象,它包含关于刚才所发生的那个事件的信息的对象,这些信息包括:

1)getActionCommand - 返回与动作相关联的命令名称
2)getWhen — 返回事件发生的时间

查看JDK Doc文档中的ActionEvent类:

java.awt.event
Class ActionEvent
java.lang.Object
  java.util.EventObject
      java.awt.AWTEvent
          java.awt.event.ActionEvent
public class ActionEventextends AWTEvent
    A semantic event which indicates that a component-defined action occurred.

[Java中的事件一般都位于 java.awt.event包下面

这个类表示一个语义上的事件,它表明了一个组件定义的动作发生了]比如点击Button,这个事件就发生了.它竟然是一个类,我们就可以通过它的对象来访问它一下的一些方法,如 etActionCommand() getWhen()

4. 事件处理器

事件处理器就是一个接收事件、解释事件并处理用户交互的方法。[归根结底就是一个方法,用来处理点击的动作,当点击事件发生的时候,事件处理器就会自动得到调用。]

5. AWT事件模型

1) JDK1.0的事件模型:层次模型(这种模型很差,基本已经用这种模型了,了解以下即可)


                     图79-1:层次模型

2) JDK1.1的事件模型:委托模型

事件监听器:实现了监听器接口的类。一个监听器对象是一个实现了专门的监听器接口的类的实例。

                        图79-2:层次模型

[说明]:对于Button,当点击Button时候,如果有与之管理的事件处理器方法,则这个方法就会执行,如果没有与之关联的方法,则就不会执行。同理对于Panel 和 Frame也是一样的原理。

6. Demo如下所示:

package com.ahueir.awt;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestButton {
	public static void main(String[] args) {
		Frame frame = new Frame("Test Button");
		Button button = new Button("Press Me!");
		
		//增加事件处理器
		button.addActionListener(new ButtonHandler());
		
		frame.add(button, BorderLayout.CENTER);
		
		frame.pack();
		frame.setVisible(true);
	}
}

class ButtonHandler implements ActionListener{
	
	/*
	 * 这边为什么要给actionPerformed()传递一个ActionEvent的参数 e 呢?为什么不传递一个字符串呢?
	 * 原因是当我们点击了按钮,就会产生一个事件对象,这个事件对象封装了产生对象的时候所有对象的信息,
	 * 包括按钮上面的标签,点击产生事件发生的时间等
	 * 这个ActionEvent产生的对象是由底层系统帮助我们生成的类似前面所讲的异常。
	 * 这个对象传递给与这个事件关联的事件处理器,事件处理器得到调用,可以通过这个对象获得封装的一些信息。
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("Button is Pressed!");
		String str = e.getActionCommand();
		System.out.println(str);
	}
}

编译执行结果产生一个按钮,点击这个按钮输出以下内容(这边就不截图了):

Button is Pressed!
Press Me!

【说明1】:

1) 在Button对象上用鼠标进行点击时,将发送一个ActionEvent事件。这个ActionEvent事件会被使用addActionListener()方法进行注册的所有ActionListener的actionPerformed()方法接收
2) ActionEvent类的getActionCommand()方法返回与动作相关联的命令名称。
3) 以按钮的点击动作为例,将返回Button的标签。

【说明2】:

查看JDK Doc文档中的Button这个类,查看里面的方法 addActionListener()

addActionListener
   public void addActionListener(ActionListener l)
Adds the specified action listener to receive action events from this button.

[添加一个特定的动作当监听到从这个按钮接受到的事件后]

[它接受的是一个ActionListener类型的参数,继续跟踪ActionListener]

java.awt.event
  Interface ActionListener

是一个接口,查看它的方法说明我们接受的是实现这个接口的实例,这个设计类似我们以前所讲过的那个迭代器继续查看它的方法

 [当某一个动作发生的时候调用它,类似监听器,实现上面的接口后就必须要实现这个方法了这边可以知道actionPerformed()就是我们这个按钮的事件处理器了,当我们单击按钮的时候,这个方法就会得到调用,首先要通过addActionListener这个方法进行关联]

所以这边只要在Button中提供了addActionListener()这个方法,并且ActionListener接口实现出来作为对象传递它,当Button点击事件发生了,就会自动调用的actionPerformed()这个方法了。

【说明3】:当单击一个按钮时就会产生一个事件(ActionEvent),然后检查是否有与该按钮关联的事件处理器(实际上就是一个方法),如果没有,那么什么都不执行;如果有,就会将该事件传递给与该按钮关联的事件处理器方法,作为该方法的参数,之后该事 件处理器方法就会自动得到调用,并且该方法可以使用传递过来的 ActionEvent 对象,进而获得事件发生时与该事件及事件源相关联的那些信息。 

7. Java 中的组件,不管是菜单,文本框,按钮之类的,若想添加事件处理器,都会使用形如 addXxxListener 的方法来添加。

8. 委托模型优点

1) 事件不会被意外地处理。
2) 有可能创建并使用适配器(adapter)类对事件动作进行分类。
3) 委托模型有利于把工作分布到各个类中。[比如说有Frame、Panel、Button三个组件,我们可以写三个事件处理器,可以针对这三个组件进行处理,点击某一个组件就对应某一个事件管理器进行处理,对应关系比较明确的]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值