Java事件处理模型

Similar documents
Swing-02.pdf

<4D F736F F F696E74202D C DB5DA3136D5C25FCAC2BCFEC7FDB6AFB3CCD0F2C9E8BCC62E BBCE6C8DDC4A3CABD5D>


Microsoft PowerPoint - 18_Event.pptx

詞 彙 表 編 號 詞 彙 描 述 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 基

PowerPoint 簡報

mvc

Microsoft Word - 正文.doc

JavaIO.PDF

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

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

无类继承.key

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

Guava学习之Resources

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

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

EJB-Programming-4-cn.doc

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

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

JBuilder Weblogic

Microsoft Word - 01.DOC

合金投资年报正文.PDF

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

可 Web 编程的NativeUI 设计与实现

(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>

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, 新建 -> 项目 ->

Chapter 9: Objects and Classes

Java 1 Java String Date

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

chp6.ppt

Microsoft PowerPoint - plan08.ppt


untitled

计算机网络实验说明

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

chap07.key

Microsoft Word - 正文.doc

Microsoft Word - ch04三校.doc

RxJava

OSWorkflow Documentation

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

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

软件工程文档编制

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

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