Java事件处理模型

Similar documents
untitled

Swing-02.pdf

<4D F736F F F696E74202D C DB5DA3136D5C25FCAC2BCFEC7FDB6AFB3CCD0F2C9E8BCC62E BBCE6C8DDC4A3CABD5D>

第1章


Microsoft PowerPoint - 18_Event.pptx

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

chp8.ppt

Microsoft Word - Broker.doc

Chapter 9: Objects and Classes

Microsoft Word - Java全文.doc

java2d-4.PDF

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

Microsoft Word - 投影片ch18

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

图形用户界面 (GUI) 设计

PowerPoint 簡報

拦截器(Interceptor)的学习

mvc

图形学 Project 2 要求 任意两个多边形, 求出其相交的区域 使用说明 例 1 第一步, 与 Project 1 画多边形的方法相同, 画一个多边形 ; 第二步, 单击 INTERSECT WITH, 随后画出第二个多边形 ; 第三步, 单击 FILL 进行填充

Chapter 9: Objects and Classes

教学〔2016〕120号

Microsoft Word - 正文.doc

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

Chapter 9: Objects and Classes

EJB-Programming-3.PDF

JavaIO.PDF

電機工程系認可證照清單 /7/1

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

无类继承.key

1.3 最终效果图 : 2 内部布局代码 2.1 按键按钮代码 // 初始化计算器上键的按钮, 将键放在一个画板内 JPanel keypanel = new JPanel(); // 用网格布局器,4 行,5 列的网格, 网格之间的水平方向间隔为 3 个象素, 垂直方向间隔为 3 个象素 keyp

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

Guava学习之Resources

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

LEFT, RIGHT // 左 // 右 (2) 当图片移动后, 按钮的坐标发生改变, 此操作通过 setloca tion() 方法实现 setlocation() 方法是从 Component 类继承的, 其定义如下 : public void setlocation(int x, int y

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

D C 93 2

1.5招募说明书(草案)

EJB-Programming-4-cn.doc

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

OOP with Java 通知 Project 3: 4 月 19 日晚 9 点

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

JBuilder Weblogic

Microsoft Word - 01.DOC

合金投资年报正文.PDF

从 宾 馆 到 又 一 城 是 十 五 分 钟, 从 又 一 城 到 邵 逸 夫 是 十 分 钟, 去 时 一 路 上 坡 很 辛 苦, 回 时 一 路 下 坡 很 轻 松, 很 像 上 小 学 时 的 心 情, 这 是 最 初 几 天 最 深 的 感 受 有 段 时 间 很 少 走 校 内 的 路


Struts2自定义类型转换.doc

可 Web 编程的NativeUI 设计与实现

幻灯片 1

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

建模与图形思考

RUN_PC連載_8_.doc

IoC容器和Dependency Injection模式.doc

javaexample-02.pdf

建模与图形思考

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

基于ECO的UML模型驱动的数据库应用开发1.doc

untitled

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Chapter 9: Objects and Classes

Java 1 Java String Date

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

第 一 章 UI 概 述 单 元 设 计 : 课 题 名 称 :UI 综 述 教 学 任 务 :1 UI 是 什 么? 2 UI 设 计 师 是 做 什 么 的? 3 UI 在 中 国 的 现 状 如 何? 4 数 据 时 代 的 用 户 体 验 (APP 视 觉 设 计 艺 术 ) 教 学 方 式

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

由社會發展趨勢探討國人睡眠品質

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

Microsoft Word - 新1-12.doc

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

chp6.ppt

提纲 1 2 OS Examples for 3

Microsoft PowerPoint - plan08.ppt

ZW1.PDF


untitled

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

计算机网络实验说明

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

chap07.key

“百企入校——广西青年企业家协会高校

Microsoft Word - 正文.doc

Microsoft Word - ch04三校.doc

ASP.NET实现下拉框二级联动组件

RxJava

OSWorkflow Documentation

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

软件工程文档编制

untitled

工程合同管理 一 民事法律关系概述 1-1 主体 拥有权利承担义务的当事人 法律关系三要素 客体 当事人权利义务所指的对象 内容 具体的权利和义务的内容 图 1-1 法律关系的构成要素

基于CDIO一体化理念的课程教学大纲设计

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

Transcription:

Java 事件处理模型 北京理工大学计算机学院 金旭亮

事件驱动 的软件系统 面向对象的软件系统许多是 事件驱动 的, 通常定义了一系列的事件, 并且事先规定好这些事件发生时应该如何响应 由于事件的发生通常是离散的, 所以 事件驱动 的软件系统并没有一个固定的执行流程 Java 的 GUI 应用程序也是 事件驱动 的 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 2

Java GUI 事件处理程序示例 手写的 Java 事件处理程序 :TheSimplestEvent.java 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 3

TheSimplestEvent.java 用户鼠标点击 JVM 调用 actionperformed(actionevent e) { } Java GUI 应用程序事件的编程模型被称之为 事件委托模型 (event delegation model) 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 4

事件处理的相关概念 事件对象 (Event object): 事件发生时所携带的信息 事件源 (Event Source): 能够产生事件的 GUI 组件对象, 如按钮 文本框等 事件监听器 (Event Listener): 当事件发生时, 事件监听器对象会得到通知, 它所事先准备好的事件处理方法被调用 这些事件处理方法的参数中, 将引用到相应的事件对象 三者之间的相互协作关系称为 事件委托模型 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 5

Java 事件委托模型的概貌 事件源 (Event Source) 注册 事件监听器 (Event Listener) 事件监听器接口 转发 封装相关信息 事件对象 (Event Object) EeventObject 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 6

事件信息 不同的事件伴随着不同的信息, 这些事件信息都保存在一个派生自 AWTEvent 的对象中 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 7

事件监听器接口 不同的事件携带不同的信息对应不同的事件监听器接口 事件监听器对象必须实现相应的事件监听器接口 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 8

Java 事件委托处理模型的使用方法 1. 写出一个实现事件监听器接口 (XXXListener) 接口的类 2. 创建此事件监听器类的一个对象, 如 myhandler 3. 对事件源组件 ( 比如按钮 ) 调用 addxxxlistener(myhandler) 方法 2014/11/17 9 金旭亮 Java 编程系列 (2014 版 )

示例项目 :TextFieldTest 回车! 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 10

事件监听器接口 ActionListener 从事件监听器基类接口 EventListener 派生而来 : public interface ActionListener extends EventListener ActionListener 接口只有一个方法 : public void actionperformed(actionevent e) 此方法封装事件响应代码 事件监听器基类接口 EventListener 没有任何成员, 这种接口被称为 标记接口 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 11

事件适配器

背景 有些事件接口定义了相当多的方法 : public interface WindowListener { void windowopened(windowevent e); void windowclosing(windowevent e); void windowclosed(windowevent e); void windowiconified(windowevent e); void windowdeiconified(windowevent e); void windowactivated(windowevent e); void windowdeactivated(windowevent e); } 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 13

背景 这会导致事件监听器类的代码很 无奈 : class Terminator implements WindowListener { public void windowclosing(windowevent e) { if (user agrees) System.exit(0); } public void windowopened(windowevent e) {} public void windowclosed(windowevent e) {} public void windowiconified(windowevent e) {} public void windowdeiconified(windowevent e) {} public void windowactivated(windowevent e) {} public void windowdeactivated(windowevent e) {} } 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 14

引入事件适配器 事件适配器 : 实现某一特定事件接口的所有方法, 只不过方法为空 定义适配器是为了简化事件处理的代码量 这时, 只需继承一个事件类, 覆盖其中感兴趣的事件代码就行了 JDK 提供了 WindowAdapter 这一类实现 WindowListener 接口, 从而大大简化了代码 2014/11/17 15 金旭亮 Java 编程系列 (2014 版 )

事件适配器类的实例 // 给窗口增加关闭功能 WindowListener w=new WindowAdapter() { public void windowclosing(windowevent e) { if (user agrees) System.exit(0); } }; frame.addwindowlistener(w); 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 16

更进一步简化 frame.addwindowlistener( new WindowAdapter() { public void windowclosing(windowevent e) { if (user agrees) System.exit(0); } }); 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 17

JDK 中的部分适配器 Event-adapter class in java.awt.event ComponentAdapter ContainerAdapter FocusAdapter KeyAdapter MouseAdapter MouseMotionAdapter WindowAdapter Implements interface ComponentListener ContainerListener FocusListener KeyListener MouseListener MouseMotionListener WindowListener 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 18

处理鼠标事件 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 19

相关接口 与鼠标相关的顶层接口有两个 :MouseListener 和 MouseMotionListener 其子接口 MouseInputListener 组合 了这两个接口的所有方法, 另有一个 MouseWheelListener 接口与鼠标中部滚轮滚动相关 MouseListener 接口 : public void mousepressed( MouseEvent event ) public void mouseclicked( MouseEvent event ) public void mousereleased( MouseEvent event ) public void mouseentered( MouseEvent event ) public void mouseexited( MouseEvent event ) MouseMotionListener 接口 : public void mousedragged( MouseEvent event ) public void mousemoved( MouseEvent event ) 方法参数 MouseEvent 封装了鼠标事件的相关信息 ( 比如 x 和 y 的坐标 ), 其基类 InputEvent 中定义了一些方法与常量, 可以用于确定鼠标的哪个按键被按下 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 20

捕获鼠标示例 参看示例项目 :MouseTracker 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 21

检测鼠标按键 主要通过 InputEvent 方法来完成这一工作 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 22

检测鼠标按键 参看示例项目 :MouseAdapterTest 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 23

使用鼠标绘图 参看示例项目 :Painter 要点 : 在 mousedragged 事件中记录下鼠标位置重写 JPanel 的 paintcomponent 方法, 在其中为记录下的每个鼠标坐标绘制一个小圆点 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 24

处理键盘事件

与按键相关的类型 最基本的是 KeyListener 接口 它定义了 keypressed, keyreleased 和 KeyTyped 方法 按键信息由 KeyEvent 对象负责承载 按键分为以下三类 : 1. Action Key: 如 F1 PageUP 之类 2. Modifier Key: 如 Ctrl Shift 3. 普通键 : 如 a A 1 [ 之类 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 26

按键示例 参看示例项目 : KeyDemo 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 27

活用事件

多重监听器 一般情况下, 事件源可以产生多种不同类型的事件, 因而可以注册 ( 触发 ) 多种不同类型的监听器 一个事件源组件上可以注册多个监听器, 针对同一个事件源的同一种事件也可以注册多个监听器 一个监听器可以被注册到多个不同的事件源上 TheSimplestExample2.java 2014/11/17 29 金旭亮 Java 编程系列 (2014 版 )

如何区分开是哪个按钮被点击? Demo: WhichIsClicked.java 默认情况下,JButton 的 ActionCommand 属性等于其 Text 属性值, 可以通过查看其基类 AbstractButton 的 getactioncommand 方法知道这点 : public String getactioncommand() { String ac = getmodel().getactioncommand(); if(ac == null) { ac = gettext(); } return ac; } 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 30

小结 : 事件处理方法的编写方式 我们可以有四种方式编写事件处理方法, 各有优缺点 : 1. 顶级类 : 创建一个独立的类, 实现特定的事件监听接口, 很少用 2. 让事件源组件自身实现特定的事件监听接口, 不推荐使用 3. 使用内部类, 推荐 ( 多个组件需要复用 ) 4. 使用匿名类, 推荐 ( 仅特定组件需要使用 ) 示例 : 1. Simple1.java--- 内部类 2. Simple2.java--- 内部匿名类 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 31

内部类实现事件监听器的示例 ButtonTest.java 使用内部类 ( 或匿名类 ) 的最大好处是事件处理程序可以很方便地访问外部类的私有成员 2014/11/17 32 金旭亮 Java 编程系列 (2014 版 )

实例分析 MulticastTest.java: 同时关闭多个窗体 要点 : 1. 新窗体的构造函数接收一个 JButton 对象 2. Close all 按钮监控多个对象 还有其他的实现方法吗? 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 33

处理文本框的 TextChange 事件 实例 :TextTest.java 2014/11/17 34 金旭亮 Java 编程系列 (2014 版 )

剖析时钟程序 JTextField 以 MVC 模式实现 当文本框的文字改变时, 相当于 Document 发生了改变, 将会调用 insertupdate,removeupdate 和 changedupdate 三个方法 这三个方法是 DocumentListener 接口的成员 需要理解 MVC 模式的含义 2014/11/17 35 金旭亮 Java 编程系列 (2014 版 )

Actions

引入 Action 的原因 在实际开发中, 经常需要让多个 UI 组件 ( 比如工具栏上的按钮或菜单上的命令 ) 实现同一个功能, 而且它们的状态需要同步, 比如某功能不可用时, 工具栏上的按钮或菜单上的命令必须同时灰掉 为了解决这个问题,Java 引入了 Action 接口, 此类派生自 ActionListener, 它扩充定义了以下的方法 : void actionperformed(actionevent event) void setenabled(boolean b) boolean isenabled() void putvalue(string key, Object value) Object getvalue(string key) void addpropertychangelistener(propertychangelistener listener) void removepropertychangelistener(propertychangelistener listener) 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 37

AbstractAction 由于 Action 接口定义了太多的方法, 为了方便开发,JDK 提供了一个 AbstractAction 类实现了这一接口, 我们可以直接继承自 AbstractAction, 重写需要的方法就行了 参看示例项目 :ActionTest 示例要点 : 1 给按钮加上了图标 2 支持快捷键 (Ctrl+B 等 ) 3 支持 ToolTips 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 38

处理菜单事件 实例 :ImageViewer.java 2014/11/17 39 金旭亮 Java 编程系列 (2014 版 )

对话框的设计与使用

模式与非模式对话框 模式对话框显示时, 必须关闭它之后才可以访问主窗体 JOptionPane 是最常用的显示模式对话框的组件, 拥有相当多的功能 : 参看示例项目 :OptionDialogTest 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 41

JOptionPane 的灵活性 JOptionPane 可以显示一个 Component, 或者是任何一个对象 ( 通常会调用它的 tostring 方法以得到一个字串 ) JOptionPane 显示之后有一个返回值, 应用程序可以通过它来知道用户的操作结果 : int selection = JOptionPane.showConfirmDialog( parent, "Message", "Title", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE); if (selection == JOptionPane.OK_OPTION)... 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 42

开发可交换信息的对话框 参看 DataExchangeTest.java 注意信息是如何传递的 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 43

综合实例 参看示例 :ColorChooserTest.java 三种对话窗口与主窗口相互交换信息的方式 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 44

多文档界面 参看示例项目 :MultipleDocumentTest 2014/11/17 金旭亮 Java 编程系列 (2014 版 ) 45