已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章 AWT事件模型 本模块讨论了事件驱动的图形用户界面(GUI)的用户输入机制。第一节 什么是事件什么是事件?- 事件描述发生了什么的对象- 事件源事件的产生器- 事件处理器接收事件、解释事件并处理用户交互的方法 如果用户在用户界面层执行了一个动作(鼠标点击和按键),这将导致一个事件的发生。事件是描述发生了什么的对象。存在各种不同类型的事件类用来描述各种类型的用户交互。1 事件源 事件源是一个事件的产生者。例如,在Button组件上点击鼠标会产生以这个Button 为源的一个ActionEvent. 这个ActionEvent实例是一个对象,它包含关于刚才所发生的那个事件的信息的对象。这些信息包括:- getActionCommand返回与动作相关联的命令名称。- GetModifiers返回在执行动作时持有的修饰符。2 事件处理器 事件处理器就是一个接收事件、解释事件并处理用户交互的方法。3 委托事件模型 委托事件模型是在JDK1.1中引入的。在这个模型中,事件被送往产生这个事件的组件,然而,注册一个或多个称为监听者的类取决于每一个组件,这些类包含事件处理器,用来接收和处理这个事件。采用这种方法,事件处理器可以安排在与源组件分离的对象中。监听者就是实现了Listener接口的类。 事件是只向注册的监听者报告的对象。每个事件都有一个对应的监听者接口,规定哪些方法必须在适合接收那种类型的事件的类中定义。实现了定义那些方法的接口的类可以注册为一个监听者。从没有注册的监听者的组件中发出的事件不会被传播。例如,这是一个只含有单个Button的简单Frame。import java.awt.*;import java.awt.event.*;public class TestButton public static void main(String args) Frame f = new Frame(Test); Button b = new Button(Press Me!); b.addActionListener(new ButtonHandler(); / ButtonHandler类是一个处理器类,/事件将被委托给这个类。f.add(b,Center); f.pack(); f.setVisible(true); public class ButtonHandler implements ActionListener public void actionPerformed(ActionEvent e) System.out.println(Action occurred); 这两个范例的特征如下:- Button类有一个addActionListner(ActionListener)方法。- AddActionListner接口定义了一个方法actionPerformed,用来接收一个ActionEvent。- 创建一个Button对象时,这个对象可以通过使用addActionListener方法注册为ActionEvents的监听者。调用这个方法时带有一个实现了ActionListener接口的类的参数。委托模型(JDK1.1或更高版本)- 在Button对象上用鼠标进行点击时,将发送一个ActionEvent事件。这个ActionEvent事件会被使用addActionListener()方法进行注册的所有ActionListener的actionPerformed()方法接收。- ActionEvent类的getActionCommand()方法返回与动作相关联的命令名称。以按钮的点击动作为例,将返回Button的标签。 这种方法有若干优点:- 事件不会被意外地处理。在层次模型中,一个事件可能传播到容器,并在非预期的层次被处理。- 有可能创建并使用适配器(adapter)类对事件动作进行分类。- 委托模型有利于把工作分布到各个类中。- 新的事件模型提供对JavaBeans的支持。 这种方法也有一个缺点:- 尽管当前的JDK支持委托模型和JDK1.0事件模型,但不能混合使用JDK1.0和JDK1.1。第二节 图形用户界面的行为1 事件类型 我们已经介绍了在单一类型事件上下文中从组件接收事件的通用机制。事件类的层次结构图如下所示。许多事件类在java.awt.event包中,也有一些事件类在API的其他地方。对于每类事件,都有一个接口,这个接口必须由想接收这个事件的类的对象实现。这个接口还要求定义一个或多个方法。当发生特定的事件时,就会调用这些方法。表9-1列出了这些(事件)类型,并给出了每个类型对应的接口名称,以及所要求定义的方法。这些方法的名称是易于记忆的,名称表示了会引起这个方法被调用的源或条件。表9-1方法类型和接口2 复杂的范例 本节将考察一个更复杂的Java软件范例。它将跟踪鼠标被按下时,鼠标的移动情况(鼠标拖动)。这个范例还将监测当鼠标没有按下时,鼠标的移动情况(鼠标移动)。 当鼠标按下或没有按下时,移动鼠标产生的事件会被实现了MouseMotionListener接口的类的对象检取。这个接口要求定义两个方法,mouseDragged()和mouseMoved()。即使你只对鼠标拖动感兴趣,也必须提供这两个方法。然而,mouseMoved()的体可以是空的。 要检取其他鼠标事件,包括鼠标点击,必须定义MouseListener接口。这个接口包括若干个事件,即:mouseEntered, mouseExited, mousePressed, mouseReleased和 mouseClicked。发生鼠标或键盘事件时,有关鼠标的位置和所按下的键的信息可以从事件中得到。代码如下:import java.awt.*;import java.awt.event.*; public class TwoListen implements MouseMotionListener, MouseListener private Frame f; private TextField tf; public static void main(String args) TwoListen two = new TwoListen(); two.go(); public void go() f = new Frame(Two listeners example); f.add(new Label (Click and drag the mouse), BorderLayout.NORTH); tf = new TextField (30); f.add (tf, BorderLayout.SOUTH); f.addMouseMotionListener(this); f.addMouseListener (this); f.setSize(300, 200); f.setVisible(true); / These are MouseMotionListener events public void mouseDragged (MouseEvent e) String s = Mouse dragging: X = + e.getX() + Y = + e.getY(); tf.setText (s); public void mouseMoved (MouseEvent e) / These are MouseListener events public void mouseClicked (MouseEvent e) public void mouseEntered (MouseEvent e) String s = The mouse entered; tf.setText (s); public void mouseExited (MouseEvent e) String s = The mouse has left the building; tf.setText (s); public void mousePressed (MouseEvent e) public void mouseReleased (MouseEvent e) 这个范例中的一些地方值得注意。它们将在以下的几节中讨论。1)定义多重接口 这个类由第4行中的如下代码声明:implements MouseMotionListener, MouseListener 声明多个接口时,可以用逗号隔开。2)监听多个源f.addMouseListener(this);f.addMouseMotionListener(this); 一个对象可以“监听”任意数量的事件源;它的类只需要实现所要求的接口。3 事件Adapters(适配器)你定义的Listener可以继承Adapter类,而且只需重写你所需要的方法。例如: 实现每个Listener接口的所有方法的工作量是非常大的,尤其是MouseListener接口和ComponentListener接口。 以MouseListener接口为例,它定义了如下方法:- mouseClicked(MouseEvent)- mouseEntered(MouseEvent)- mouseExited(MouseEvent)- mousePressed(MouseEvent)- mouseReleased(MouseEvent) 为了方便起见,Java语言提供了Adapters类,用来实现含有多个方法的类。这些Adapters类中的方法是空的。你可以继承Adapters类,而且只需重写你所需要的方法。例如: import java.awt.*; import java.awt.event.*; public class MouseClickHandler extends MouseAdapter / We just need the mouseClick handler, so we use / the Adapter to avoid having to write all the / event handler methods public void mouseClicked (MouseEvent e) / Do something with the mouse click. 4 匿名类可以在一个表达式的域中,包含整个类的定义。这种方法定义了一个所谓的匿名类并且立即创建了实例。匿名类通常和AWT事件处理一起使用。例如:import java.awt.*;import java.awt.event.*; public class AnonTest private Frame f; private TextField tf; public static void main(String args) AnonTest obj = new AnonTest(); obj.go(); public void go() f = new Frame(Anonymous classes example); f.add(new Label(Click and drag the + mouse,BorderLayout.NORTH); tf = new TextField (30); f.add(tf,BorderLayout.SOUTH); f.addMouse
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 美术设计助理试题及答案
- 产业经济学政策试题及答案
- 2025-2030智慧酒店从业人员培训服务质量收益分析研究报告
- 2025-2030智慧社区服务体系建设与居民生活改善分析及市场规模与投资评估研究
- 2025-2030智慧社会综合服务行业市场供需分析及公益投资评估规划研讨会报告
- 2025-2030智慧物流行业市场供需分析及投资评估规划分析研究报告
- 连云港市中医院穿刺活检技术考核
- 2025-2030智慧物流产业市场竞争格局分析及未来发展机遇研究报告
- 2025-2030智慧港口项目市场竞争格局与投资机会规划分析报告
- 2025-2030智慧港口自动化装卸系统制造行业市场供需调研及投资发展策略规划分析报告
- GB/T 15062-2025变形高温合金无缝管
- 残疾人突发事件应急预案范文
- 食品安全管理制度完整打印
- 6.18 从九一八事变到西安事变 教学设计 统编版八年级历史上册
- 2025年陕西省法院书记员招聘考试笔试试题含答案
- T/CAPE 10108-2024设备设施报废管理指南
- 异位妊娠诊疗指南
- 相和歌教学课件
- 安全巡检工作要点讲解
- 古籍修复培训课件
- 中小学环保主题班会活动方案
评论
0/150
提交评论