<4D F736F F F696E74202D C DB5DA3136D5C25FCAC2BCFEC7FDB6AFB3CCD0F2C9E8BCC62E BBCE6C8DDC4A3CABD5D>

Similar documents
untitled

第1章

Java事件处理模型

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

Chapter 9: Objects and Classes

Microsoft Word - 投影片ch18

Chapter 9: Objects and Classes

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

chp8.ppt

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

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

Microsoft Word - Java全文.doc

Microsoft Word - 新1-12.doc


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

图形用户界面 (GUI) 设计

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

Chapter 9: Objects and Classes

Swing-02.pdf

Microsoft Word - Broker.doc

无类继承.key

Microsoft PowerPoint - 18_Event.pptx

Microsoft Word - 正文.doc

软件工程文档编制

Microsoft Word - ch04三校.doc

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

Chapter 9: Objects and Classes

EJB-Programming-4-cn.doc

EJB-Programming-3.PDF

JBuilder Weblogic

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

模板

Microsoft Word - 正文.doc

mvc

chp11.ppt

Microsoft Word - 01.DOC

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

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

untitled

java2d-4.PDF

OOP with Java 通知 Project 3 提交时间 3 月 29 日晚 9 点 Piazza Project 2 投票

c_cpp

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

untitled

拦截器(Interceptor)的学习

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

Microsoft Word 閱讀參考答案.docx

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

Struts2自定义类型转换.doc

Guava学习之Resources

Microsoft PowerPoint - plan08.ppt

untitled

javaexample-02.pdf

IoC容器和Dependency Injection模式.doc

Microsoft PowerPoint - L17_Inheritance_v4.pptx

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

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

手册 doc

Java

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

Microsoft Word - 澎湖田調報告_璉謙組.doc

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

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

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

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

PowerPoint 簡報

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

JavaIO.PDF

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

3.1 num = 3 ch = 'C' 2

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

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

Adobe® Flash® 的 Adobe® ActionScript® 3.0 程式設計

chp6.ppt

摘 要 本 校 多 媒 體 設 計 系 與 上 海 戲 劇 學 院 創 意 學 院 在 多 次 聯 繫 交 流 之 下, 已 簽 署 合 作 備 忘 錄, 積 極 尋 求 兩 校 合 作 教 學 與 共 同 創 作 之 機 會 藉 由 本 系 學 生 作 品 腦 殘 公 寓 入 圍 第 五 屆 中

51 C 51 isp 10 C PCB C C C C KEIL

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

1.5招募说明书(草案)

Microsoft Word - chap10.doc

建模与图形思考

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

untitled

2/14 Buffer I12, /* x=2, buffer = I 1 2 */ Buffer I243, /* x=34, buffer = I 2 43 */ x=56, buffer = I243 Buffer I243I265 code_int(int x, char *buffer)

Microsoft Word - 正文.doc

國立臺東高級中學102學年度第一學期第二次期中考高一國文科試題

!! :!!??!!?!??!!!... :... :'?'?! :' ' :'?' :'?' :'!' : :? Page 2

<D2B0D0C4D3C5D1C52DC8CED6BEC7BF202D20BCC7CAC2B1BE>

Microsoft Word - Sunday

鎶ョ焊0

秘密大乘佛法(下)

Page 2 of 12

Microsoft Word - 物件導向編程精要.doc

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

Microsoft PowerPoint - 6. 用户定义类型User-defined Datatypes.ppt [兼容模式]

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

【主持人】:给大家介绍一下,这次的培训是我们画刊部的第三次培训,当然今天特别有幸请来著吊的摄影家李少白老师给我们讲课





Transcription:

第 16 章事件驱动程序设计 1

动因 假如希望编写一个 GUI 程序, 提示用户输入贷款总额 年利率和年数, 然后点击 Compute Loan 按钮获取月偿还 额和总偿还额 如何完成这个任务呢? 必须使用事件驱 动程序设计来编写代码以响应点击按钮事件 LoanCalculator Run 2

动因 假设希望编写程序用动画实现一面旗上升, 如图 16.1(b-d) 所示 如何完成这个任务呢? 解决这个问题的方式有好几 种 一种有效的方式就是在事件驱动程序设计中使用一个 定时器, 这也是本章的主题 3

学习目标 描述事件 事件源和事件类 ( 第 16.2 节 ) 定义监听器类 向源对象注册监听器对象, 然后编写代码来处理事件 ( 第 16.3 节 ) 使用内部类定义监听器类 ( 第 16.4 节 ) 使用匿名内部类定义监听器类 ( 第 16.5 节 ) 探究创建和注册监听器的各种编码风格 ( 第 16.6 节 ) 点击按钮从文本域获取输入 ( 第 16.7 节 ) 编写程序处理 WindowEvent( 第 16.8 节 ) 使用监听器接口适配器简化监听器类的代码 ( 第 16.9 节 ) 编写程序程序处理鼠标事件 MouseEvent ( 第 16.1010 节 ) 编写程序程序处理键盘事件 KeyEvent( 第 16.11 节 ) 使用 javax.swing.timer 类控制动画 ( 第 16.12 节 ) 4

面向过程和事件驱动程序设计 面向过程程序设计按程序顺序执行 在事件驱动程序设计中, 当事件发生时执行代码 5

重看程序清单 11.7 尝试事件驱动程序设计 这个例子在框架中显示一个按钮 当点击按钮时个按钮 当点击按钮时, 在 控制台显示一条消息 HandleEvent Run 6

事件 事件 (event) 可以定义为程序发生了某些事情的信号 外部用户动作可以触发事件, 例如 : 移动鼠标 点击鼠标和键盘, 操作系统也会触发事件, 例如 : 定时器 7

Event 类 ActionEvent ContainerEvent AdjustmentEvent FocusEvent MouseEvent EventObject AWTEvent ComponentEvent InputEvent ItemEvent PaintEvent KeyEvent TextEvent WindowEvent ListSelectionEvent ChangeEvent 8

事件消息 事件对象包含与事件相关的一切属性 可以使用 EventObject 类中的实例方法 getsource() 获得事件的源对象 EventObject 类的子类处理特定类型的事件, 例如 : 按钮 动作 窗口事件 组件事件 鼠标事件以及按键事件 表 15.1 罗列外部用户动作 源对象和触发的事件类型 9

可选择的用户动作 用户动作源对象触发的事件类型 点击按钮 JButton ActionEvent 点击复选框 JCheckBox ItemEvent, ActionEvent 点击单选按钮 JRadioButton ItemEvent,, ActionEvent 在文本域按回车键 JTextField ActionEvent 选定一个新项 JComboBox ItemEvent, ActionEvent 窗口打开 关闭等 Window WindowEvent 鼠标按住 释放等 Component MouseEvent 键盘释放 按下等 Component KeyEvent 10

基于委托的模型 用户动作 触发一个事件 source: SourceClass +addxlistener(listener: XListener) XListener +handler(event: ( XEvent) (a) 一个具有通用监听器的通用源组件 调用 source.addxlistener(listener) 来注册 ; listener: ListenerClass source: JButton ActionListener +addactionlistener(listener: ActionListener) +actionperformed(event: ActionEvent) (b) 一个具有 ActionListener 的一个实例 调用 source.addactionlistener(listener) 来注册 ; listener: CustomListenerClass 11

源组件的内部函数 source: SourceClass source: JButton +addxlistener(xlistener listener) +addactionlistener(actionlistener listener) An event is triggered Keep it a list An event is triggered Keep it a list event: XEvent Invoke listener1.handler(event) listener2.handler(event) listenern.handler(event) listener1 listener2 listenern event: ActionEvent Invoke listener1.actionperformed(event) listener2.actionperformed(event) listenern.actionperformed(event) listener1 listener2 listenern (a) 通用源对象的内部函数 (b) JButton 对象的内部函数 12

基于委托的模型 : 举例 JButton jbt = new JButton("OK"); ActionListener listener = new OKListener(); jbt.addactionlistener(listener); 13

选定的事件处理器 事件类 ( 处理器 ) 监听器接口监听器方法 (Handlers) ActionEvent ActionListener actionperformed(actionevent) ItemEvent ItemListener itemstatechanged(itemevent) WindowEvent WindowListener windowclosing(windowevent) windowopened(windowevent) windowiconified(windowevent) windowdeiconified(windowevent) windowclosed(windowevent) windowactivated(windowevent) windowdeactivated(windowevent) ContainerEvent ContainerListener componentadded(containerevent) componentremoved(containerevent) MouseEvent MouseListener mousepressed(mouseevent) mousereleased(mouseevent) mouseclicked(mouseevent) mouseexited(mouseevent) mouseentered(mouseevent) KeyEvent KeyListener keypressed(keyevent) keyreleased(keyevent) keytypeed(keyevent) 14

java.awt.event.actionevent java.util.eventobject +getsource(): Object 返回事件的源对象 java.awt.event.awtevent java.awt.event.actionevent +getactioncommand(): String +getmodifiers(): int +getwhen(): long 返回和这个动作有关的命令字符串 对按钮来说, 它的文本就是命令字符串 返回在这个动作事件过程中按住的修改键 返回这个事件发生的时间戳 这个时间是从 GMT 时间 1970 年 1 月 1 日 0 点 0 分开始的毫秒数 15

举例 :ControlCircle 第一版 ( 无监听器 ) 现在, 我们可以考虑编写一个程序, 使用两个按钮控 制一个圆的大小 : ControlCircle1 l Run 16

举例 : ControlCircle 第二版 ( 带 Enlarge 的监听器 ) 现在, 让我们考虑编写一个使用两个按钮来控制圆的 大小的程序 ControlCircle2 l Run 17

内部类监听器 监听器类是特意为创建一个 GUI 组件 ( 例如 : 一个按钮 ) 的监听器对象而设计的 监听器类不被其它应监听器类不被其它应用程序所共享 因此, 正确的做法是将它作为一个内部类定义在框架类中 18

内部类 内部类 : 定义在另一个类内的类 优点 : 在一些应用程序中, 内部类可以使得程 序更加简洁 内部类可以引用定义在它嵌套的外部类中的数据 和方法, 所以, 不需要将外部类对象的引用传递 给内部类的构造方法 ShowInnerClass 19

内部类 ( 续 ) public class Test {... } // OuterClass.java: inner class demo public class OuterClass { private int data; public class A {... } (a) public class Test {... } // Inner class public class A {... } (b) } /** A method in the outer class */ public void m() { // Do something } // An inner class class InnerClass { /** A method in the inner class */ public void mi() { // Directly reference data and method // defined in its outer class data++; m(); } } (c) 20

内部类 ( 续 ) 内部类可以使程序更加简单和简洁 一个内部类支持它包含的外部类的工作, 它被编译成一个名为 OuterClassName$InnerClassName.class 的类 例 如 : 内部类 InnerClass 在类 OuterClass 被编译为 OuterClass$InnerClass.class 21

内部类 ( 续 ) 一个内部类可以声明为 public protected 或 private, 遵 从和应用与在类成员上一样的可见性规则 可以将内部类定义为 static 一个 static 内部类可以使用 外部类的名字访问 一个 static 类是不能访问外部类的 非静态成员的 22

匿名内部类 匿名内部类必须总是扩展自父类或实现接口, 但是它不能有 显式的 extends 或者 implements 子句 匿名内部类必须实现父类或接口中所有的抽象方法 匿名内部类总是使用它父类的无参数构造方法来创建一个实 例 如果匿名内部类实现了接口, 构造方法就是 Object() 匿名内部类被编译为一个名为 OuterClassName$n.class 的类 例如 : 如果外部类 Test 有两个匿名内部类, 那么它们就被编 译为 Test$1.class 和 Test$2.class 23

匿名内部类 ( 续 ) 可以使用匿名内部类简化内部类监听器 匿名内部类 是没有名字的内部类 它一步完成声明内部类和创建一 个该类的实例 一个匿名内部类的声明如下所示 : new SuperClassName/InterfaceName() { // Implement or override methods in superclass or interface // Other methods if necessary } AnonymousListenerDemo Run 24

定义监听器类的另一种方式 定义监听器类有很多其它方式 例如 : 可以改写程 序清单 16-3, 新程序只创建一个监听器, 将这个监听 器注册给按钮, 然后让监听器检测出事件源, 即哪 个按钮触发了这个事件 DetectSourceDemo Run 25

定义监听器类的另一种方式 你也可以定义一个自定制框架类来实现 ActionListener FrameAsListenerDemo Run 26

问题 : 贷款计算器 LoanCalculator Run 27

举例 : 处理窗口事件 目标 : 演示窗口事件的处理 Window 类的任何一个子类都可能触发下面的窗口事 件 : 打开窗口 正在关闭窗口 关闭窗口 激活窗 口 变成非活动窗口 最小化窗口和还原窗口 这 个程序构建一个框架个框架, 监听窗口事件, 然后显示一 条消息表明当前发生的事件 TestWindowEvent Run 28

MouseEvent java.awt.event.inputevent t te t +getwhen(): long +isaltdown(): boolean +iscontroldown(): boolean +ismetadown(): boolean +isshiftdown(): boolean 返回这个事件发生的时间戳如果在这个事件中按下 Alt 键则返回 true 如果在这个事件中按下 Control 键则返回 true 如果在这个事件中按下 Meta 键则返回 true 如果在这个事件中按下 Shift 键则返回 true java.awt.event.mouseevent +getbutton(): int +getclickcount(): int +getpoint(): java.awt.point +getx(): int +gety(): int 表明是否点击鼠标按钮返回和这个事件相关的鼠标点击数返回包含 x 坐标和 y 坐标的 Point 对象返回鼠标点的 x 坐标返回鼠标点的 y 坐标 29

处理鼠标事件 Java 提供了两个处理鼠标事件的监听器接口 MouseListener 和 MouseMotionListener MouseListener 接口可以监听像鼠标的按下 释 放 输入 退出或点击的动作 MouseMotionListener 接口可以监听像拖动鼠 标或移动鼠标的动作 30

处理鼠标事件 java.awt.event.mouselistener +mousepressed(e: MouseEvent): void +mousereleased(e: MouseEvent): void +mouseclicked(e: MouseEvent): void +mouseentered(e: MouseEvent): void +mouseexited(e: MouseEvent): void 在源组件上按下鼠标之后被调用释放源组件上的鼠标按钮之后被调用在源组件上点击 ( 按下或释放 ) 鼠标按钮之后被调用在鼠标进入源组件之后被调用在鼠标退出源组件之后被调用 java.awt.event.mousemotionlistener +mousedragged(e: MouseEvent): void +mousemoved(e: MouseEvent): void 按下按钮移动鼠标按钮之后被调用 不按住按钮移动鼠标按钮之后被调用 31

举例 : 使用鼠标在面板上移动消息 目标 : 编写一个 程序, 在面板上 显示一条消息 可以用鼠标移动 这条消息 消息 会随着鼠标的拖 动而移动, 消息 总是显示在鼠标 的指针处 MoveMessageDemo Run 32

处理键盘事件 使用下面 KeyListener 接口中的处理器来处理键 盘事件 : keypressed(keyevent e) 当按下一个键时被调用 keyreleased(keyevent e) 当松开一个键时被调用 keytyped(keyevent e) 当按下一个键然后松开该键时被调用 33

KeyEvent 类 方法 : getkeychar() method getkeycode() method 键值 : Home End Page Up Page Down 等等... VK_HOME VK_END VK_PGUP VK_PGDN 34

KeyEvent 类 ( 续 ) java.awt.event.inputevent java.awt.event.keyevent t t +getkeychar(): char +getkeycode(): int 返回这个事件中和键相关的字符 返回这个事件中和键相关的整数值 35

举例 : 键盘事件 Demo 目标 : 显示用户输入的字符 用户也可以使用箭头键向上 向下 向左 向右移动字符 KeyEventDemo Run 36

Timer 类 一些非 GUI 组件可以触发事件 类 javax.swing.timer 就是一个按照预定频率触发 ActionEvent 事件的源组件 javax.swing.timer +Timer(delay: int, listener: ActionListener) +addactionlistener(listener: ActionListener): void +start(): void +t +stop(): void +setdelay(delay: int): void 创建一个带特定的毫秒延时和 ActionListener 的 Timer 对象给定时器增加一个 ActionListener 启动一个定时器终止一个定时器为这个定时器设置一个新的延时值 Timer 类可以用于控制动画 例如 : 可以利用它显示一条移动 的消息 AnimationDemo Run 37

时钟动画 在第 14 章, 绘制一个显示当前时间的 StillClock 但是, 时钟显示过后就不再走针了 如何才能使时钟都能显示 新的当前时间呢? 使时钟走针的关键是每秒都用新的当 前时间来重新绘制这个时钟 可以使用定时器控制如何 重新绘制时钟 ClockAnimation Run 38

作业 复习题 实验 16 编程练习题 ( 无 * 的 ) 39