当前课程知识点:Java程序设计 > 第七章 图形用户界面 > 7.6-事件处理的基本概念 > 事件处理的基本概念
大家好
欢迎回来继续学习
Java语言程序设计
这一节我们来了解一下
事件处理的一些基本概念
我们知道GUI的程序呢
它都是事件驱动的
事件驱动是什么意思呢
就是我们看到的大多数程序
都是这样的
你打开这个程序
看到这个界面以后呢
它上面肯定有一些图形界面的组件
在那儿
那么如果你不动它呢
它也没什么反应
就在那儿等着
等着你去操作
你操作某些组件
因此就触发了一些事件
那么就会有响应代码
来对你的操作做出相应的反应
那么这种就是事件驱动的编程模式
这一节我们就来了解一下
这个事件处理的
基本的一些概念
在图形用户界面的程序中
常见的事件包括鼠标移动
单击双击鼠标的各个按纽
单击某些按纽
或者在文本字段中输入
在菜单中选择菜单项
在组合框中选择
还有单选 多选
拖动滚动条
关闭窗口等等
这些常见的操作
我想大家都是熟悉的
那么当你跟这些组件进行交互
你去操作它的时候呢
都会触发相应的事件
那么在Swing里面
是通过事件对象来包装事件的
程序可以通过事件对象
来获得这个事件的有关信息
获得了这些信息以后
对应的程序段才好根据得到的信息进行相应的处理
才可以响应这个事件
与事件处理相关的几个要素
包括事件源 事件监听器
还有事件对象
事件源就是与用户进行交互的
这些GUI的组件
表示事件来自于哪个组件或者是对象
比如说要对按纽被按下这个事件
编写事件处理器的话
那么按纽就是事件的源
那么什么是事件监听器呢
就是负责监听事件
并且做出响应的代码
一旦它监视到事件发生呢
就会自动调用相应的事件处理程序
去做出响应
事件对象呢
它封装了有关已经发生了什么事儿的
这些信息
比如说按纽被按下
就是一个要被处理的事件
那么当用户按下按纽的时候
就会产生一个事件对象
事件对象中就包含着
相关的信息和事件源
听起来这个事件处理机制
好像挺复杂的
程序是不是很难写呢
其实不是
写java程序的话
程序员只要关注两件事情就可以了
一个就是为事件源注册一个
事件监听器
第二个就是要写一段代码
来响应这个事件
在每个事件源上面
都有注册监听器
和取消注册的功能
一旦注册了监听器以后
如果有事件发生
已经注册的监听器呢就会被通知
一个事件源可以注册
多个事件监听器
而每个事件监听器
又可以对多种事件进行监听
比如一个JFrame事件源上面
我们可以注册好多个事件
比如说可以注册窗口事件监听器
去响应窗口关闭 最大化 最小化
还可以注册鼠标事件监听器
去响应鼠标的点击移动这些操作
那么事件监听器又是什么呢
事件监听器是一个对象
要通过事件源的add
什么什么Listener方法
来注册到这个事件源上面
不同的组件呢
是可以注册不同的事件监听器的
一个事件监听器中呢
也可以包含有对多种具体事件的
专用处理方法
比如说处理鼠标事件的监听器接口
MouseListener里面
就包含着对多种鼠标动作的响应
接下来我们再来看事件对象
这里列出来几种常用的事件对象
像ActionEvent
一般来说当你发生按下按纽
选择了一个项目
文本框中输入内容
并且打了一个回车呀
都会触发一个ActionEvnet
还有ItomEvent
比如说像CheckBox JComboBox
当你对它进行操作选择以后呢
就会触发一个ItomEvnet
就会产生这样一个事件对象
还有就是ChangeEvent
比如像一些这个Slider
一些拖曳的滑杆
还有一些进度条
如果它的状态改变的话
就会触发这个ChangeEvent
一个ChangeEvent对象就会产生
那么如果对窗口进行操作呢
就会触发这种窗口事件
就会产生WidowEvent对象
那鼠标操作呢
就会产生鼠标事件
那就会产生一个MouseEvent对象
接下来这个表中
就简要的列了一下
常见的事件源
以及这个事件源它对应的事件对象
它要触发的事件
以及相应的监听器
我们看到这个表中
简要的列了一下
列了一下的目的就是说
如果我们希望去用这些组件
希望去响应它的事件的时候
我们对它有一个大致的了解
当然如果你真的要去响应
这些事件
去注册这些事件监听器
去写事件响应代码的话呢
还是需要详细的去查阅API文档的
在这儿有这个简表呢
可以说对大家是一个提示
知道到API文档里面去查什么
对于这些内容呢
我们课里会有一些例题
涉及到一部分内容
但是不会仔细的每一个都讲
好
接下来我们如果希望
能够写事件响应程序的话呢
我们就要来了解一下
事件监听器接口
以及对应的适配器类
什么是事件监听器接口呢
比如说MouseListener就是一个接口
那里面规定了要响应鼠标事件
需要写哪些方法
把这些方法的原型都规定了
当然了接口中是没有方法体的
所以一个事件监听器接口
就是规定了要响应
某类事件的话
你必须要写什么样的响应方法
规定这个的
这就是事件监听器接口
另外为什么还要有这个
事件监听器的适配器类呢
我们仍然以这个
鼠标事件监听器为例
一个MouseListener接口里面
规定了五个方法
分别响应不同的鼠标动作
但是如果你在某个程序中
只想响应一种
唯一的鼠标动作
而其他的鼠标动作
你不打算响应的话
那怎么办呢
如果你实现了
MouseListener接口的话
你就必须把五个方法的方法体都实现
不然的话你是没办法产生实例的
而适配器呢
就是起来这个作用的
帮我们把那些方法体都实现了
然后你关注哪个方法体的特殊实现
你就去覆盖一下
这一个方法体就行了
接下来我们通过例子也会
给大家看一下
我们要编写事件处理程序
到底有几种途径呢
一种就是实现事件监听器接口
还有我们可以去扩展或者叫继承
那些实现了监听器接口的适配器类
另外就是我们可以用匿名的内部类
还有有的时候
我们可以用(λ)表达式
要实现事件监听器接口
就需要实现接口中的所有的方法
对于我们不需要进行处理的
事件的方法呢
也要列出它的方法体
哪怕这个方法体
就是一对空的大括号
那你也得写
那么如果这个事件监听器
它有相应的适配器类
那这个时候我们去继承适配器类
就不用管那些
我们不介意的方法
只需要覆盖我们感兴趣的
事件处理方法就可以了
如果我们的类已经扩展了
或者继承了某个超类
那这个时候我们就没有机会
再去继承事件监听器的适配器类了
这种情况下怎么办呢
我们还可以使用匿名的内部类
来作为一种弥补
如果一个事件监听器
它只有一个抽象方法
那么就是一个函数式的监听器接口
这个时候我们就可以用λ表达式
关于λ表达式
我们在这门课中
不做详细的介绍
但是这儿只是给大家
这么一个提示
如果大家愿意的话
可以去另外的查阅相关的资料
接下来我们就通过一个
具体的简单的例子
来体验一下什么是事件响应
这个例子呢
首先它显示一个窗口
然后当我们的鼠标在窗口中
移到某个地方
然后点击的时候
这个窗口的标记栏里面
就显示当前点击的时候的
鼠标的坐标位置
接下来我们就通过三种方式
来实现这个功能
第一种方法就是实现
MouseListener接口
第二种方法是继承MouseAdapter类
第三种方法就是使用匿名的内部类
首先我们来看一下
实现MouseListener接口
我们看我们这个类
实现了这个鼠标监听器接口
在这个鼠标监听器类里面呢
声明了五个响应鼠标操作的方法
都是没有方法体的
那我们实现它呢
就要把这五个方法的方法体都实现
但是我们实际上只关注
mouseClick的事件
对其他的事件
我们不想给出任何反应
那怎么办
那你也不能置之不理
大家看这四个方法
都写了空方法体
这个逻辑很简单
我们把这个实现了MouseListener的
当前对象作为事件监听器注册上去
那么如果点了鼠标的话
就会有这个mouseClick的方法
来响应显示这个坐标点的位置
可是看这个程序有点别扭
我们不关注的动作呢
也要写这个空方法体在这儿
显然是太罗嗦了
再看这个方案呢
就是去继承或者去扩展这个
MouseAdapter类
这是一个适配器类
那么这个适配器到底干了什么呢
其实这个适配器
就是替我们把它接口中的
一些方法
都实现为空方法体了
所以其他部分是一样的
只是在这儿
我们只需要覆盖mouseClick的方法
就行了
对于其他的方法
我们不用再去写空方法体了
因为在MouseAdapter里面
帮我们把空方法体都写好了
这样这个程序就显得简洁一些
如果说我们不想去继承
一个适配器类
那我们还有另外一种选择
就是使用这个匿名的内部类
就在这儿注册监听器的时候
注册监听器的时候
这是需要一个监听器对象的
是需要一个实现了
监听器接口的
或者继承了鼠标事件监听器
适配器类的对象
放在这儿
所以我们就在这儿构造一个
匿名内部类的对象
new一个什么呢
new一个继承了MouseAdapter的
类的对象
这个匿名内部类
它继承了MouseAdapter
同时在里面我们看到
它去覆盖了这个mouseClick的方法
而其他的方法都没有管它
这个类就用这一次
就在这儿注册监听器的时候要用
要构造这个类的对象作为监听器
所以就不用给它名字
这个就是使用匿名内部类的办法
这三种方法呢
得到的效果都是一样的
不管我们运行哪个程序
得到的效果都是
我们将鼠标点在这个窗口中
某个位置的时候
它这个标题栏上
就会显示鼠标点击时候的
这个坐标位置
在这一节我们初步了解了一下
事件处理的一些基本的概念
了解了事件源
事件监听器 事件对象这些要素
也通过一个简单的例子
了解了我们写事件响应程序
可以有哪些基本的方法
好 这一节内容就是这样
-1.0-导学
--1.0-导学
-1.1-Java与面向对象程序设计简介
--第一章 Java语言基础知识--1.1-Java与面向对象程序设计简介
-1.2-基本数据类型与表达式
-第一章 Java语言基础知识--1.2-基本数据类型与表达式
-1.3-数组
--1.3.1-数组
-第一章 Java语言基础知识--1.3-数组
-1.4-算法的流程控制
--第一章 Java语言基础知识--1.4-算法的流程控制
-1.5-第一章小结
-第一章编程练习题
-课件
--外部链接
-Java环境配置、Eclipse使用、Helloworld程序详解
--使用eclipse建立Java项目、编写和运行Java程序
-Java数据类型
--Java整数类型
--Java浮点类型
--数据类型实战
--数据类型转换
--Java强制类型转换精度损失示例与表达式中的数据类型转换
-Java数组
-Java变量
--Java的变量
-命令行参数
--命令行参数的介绍
-2.0-导学
--2.0-导学
-2.1-面向对象方法的特性
--第二章 类与对象--2.1-面向对象方法的特性
-2.2-1-类声明与对象创建
--第二章 类与对象--2.2-1-类声明与对象创建
-2.2-2-数据成员
--第二章 类与对象--2.2-2-数据成员
-2.2-3-方法成员
--第二章 类与对象--2.2-3-方法成员
-2.2-4-包
--2.2-4-包
--第二章 类与对象--2.2-4-包
-2.2-5-类的访问权限控制
--第二章 类与对象--2.2-5-类的访问权限控制
-2.3-1-对象初始化
--第二章 类与对象--2.3-1-对象初始化
-2.3-2-内存回收
--第二章 类与对象--2.3-2-内存回收
-2.4-枚举类
--2.4-枚举类
--第二章 类与对象--2.4-枚举类
-2.5-应用举例
--2.5-应用举例
-2.6-第2章小结
-第二章编程练习题
-课件
--第二章课件
-3.0-导学
--3.0-导学
-3.1.1-3.1.2-类继承的概念和语法
--第三章 类的重用--3.1.1-3.1.2-类继承的概念和语法
-3.1.3-隐藏和覆盖
--第三章 类的重用--3.1.3-隐藏和覆盖
-3.2-Object 类
--第三章 类的重用--3.2-Object 类
-3.3-终结类与终结方法
--第三章 类的重用--3.3-终结类与终结方法
-3.4-抽象类
--3.4-抽象类
--第三章 类的重用--3.4-抽象类
-3.5-泛型
--3.5-泛型
--第三章 类的重用--3.5-泛型
-3.6-类的组合
--3.6-类的组合
-3.7-小结
--3.7-小结
-第三章编程练习题
-课件
--课件
-4.0-导学
--导学
-4.1-接口
--接口
--第四章 接口与多态--4.1-接口
-4.2.1-4.2.2-类型转换
--类型转换
--第四章 接口与多态--4.2.1-4.2.2-类型转换
-4.2.3-方法的查找
--方法的查找
--第四章 接口与多态--4.2.3-方法的查找
-4.3-多态的概念
--多态的概念
--第四章 接口与多态--4.3-多态的概念
-4.4-多态的应用举例
--多态的应用举例
--第四章 接口与多态--4.4-多态的应用举例
-4.5-构造方法与多态性
--构造方法和多态性
--第四章 接口与多态--4.5-构造方法与多态性
-4.6-本章小结
--本章小结
-第四章编程作业
-课件
--课件
-5.0-导学
--5.0-导学
-5.1.1-5.1.2-异常处理的概念
--第五章 输入输出--5.1.1-5.1.2-异常处理的概念
-5.1.3-5.1.5-异常的处理
--第五章 输入输出--5.1.3-5.1.5-异常的处理
-5.2-输入输出流的概念
--输入输出流的概念
--第五章 输入输出--5.2-输入输出流的概念
-5.3.1-写文本文件
--写文本文件
--第五章 输入输出--5.3.1-写文本文件
-5.3.2-读文本文件
--读文本文件
--第五章 输入输出--5.3.2-读文本文件
-5.3.3-写二进制文件
--写二进制文件
--第五章 输入输出--5.3.3-写二进制文件
-5.3.4-读二进制文件
--读二进制文件
-5.3.5-File类
--File类
-5.3.6-处理压缩文件
--处理压缩文件
-5.3.7-对象序列化
--对象序列化
-5.3.8-随机文件读写
--随机文件读写
-5.4-本章小结
--本章小结
-课件
--课件
-6.0-导学
--导学
-6.1-Java集合框架介绍
--第六章 对象群体的组织--6.1-Java集合框架介绍
-6.2-主要接口及常用的实现类
--第六章 对象群体的组织--6.2-主要接口及常用的实现类
-6.3-常用算法
--常用算法
-6.4-数组实用方法
-6.5-基于动态数组的类型(Vector, ArrayList)
--基于动态数组的类型(Vector, ArrayList)
-6.6-遍历Collection
-6.7-Map接口及其实现
-6.8-第6章小结
--第6章小结
-课件
--课件
-7.0-导学
--导学
-7.1-绘图
--绘图
-7.2-Swing基础
--Swing基础
-7.3-Swing的层次
--Swing的层次
-7.4-布局管理
--布局管理
-7.5-内部类
--内部类
-7.6-事件处理的基本概念
-7.7-事件派发机制
--事件派发机制
-7.8-顶层容器
--7.8-顶层容器
-7.9-中间层容器(一)
-7.10-中间层容器(二)
-7.11-原子组件(一)
-7.12-原子组件(二)
-7.13-原子组件(三)
-7.14-其它Swing特性
-7.15-第7章小结
-课件
--课件