[疯狂Java笔记]事件处理:Java事件处理模型
来源:互联网 发布:淘宝pc端图片尺寸大小 编辑:程序博客网 时间:2024/06/07 12:05
1. Java事件处理三要素:
1) 事件源(Event Source):即事件发生的场所,就是指各个组件,如按钮等,点击按钮其实就是组件上发生的一个事件;
2) 事件(Event):事件封装了组件上发生的事情,比如按钮单击、按钮松开等等;
3) 事件监听器(Event Listener):负责监听事件源上发生的特定类型的事件,当事件到来时还必须负责处理相应的事件;
2. 事件处理的机制:
1) 首先事件是有不同的类别的,比如按钮单击、菜单项单击等事件就属于“动作事件”(Action Event),而关闭窗口、最小化窗口等事件就属于“窗口事件”(Window Event);
2) 不同类型的事件需要用不同类型的监听器监听;
3) 而监听器是一种类对象,这种类必须实现监听器接口(Listener),对于监听不同类型的事件AWT库准备了不同类型的监听器接口,比如要监听动作事件就必须实现ActionListener接口,监听窗口事件就必须实现WindowListener接口;
!监听器中最重要的就是事件处理方法了,监听器必须在接受事件之后进行处理(响应);
4) 如何实现监听?
i. 首先事件源(发生事件的组件)必须同意我身上发生的事件允许那些监听器监听;
ii. 也就是说想监听它身上发生的事件的监听器必须到它这里注册,即组件必须调用方法addXxxListener将监听器注册到它的监听器列表中;
iii. 当事件发生时就会将事件对象(Event)发送到所有注册过的监听器那里进行处理;
5) 事件源、事件、监听器的对应关系:
i. 首先一个事件源可以产生多种类型的事件,比如窗口右上角的×按钮,当单击它时就会产生两种类型的事件,一个是按钮单击事件(属于Action Event),另一个是窗口关闭事件(属于Window Event);
ii. 监听器接口是什么类型就发送什么类型的事件:如果注册的监听器实现的是ActionEvent的接口,那么上述×按钮就只发送按钮单击事件给它而不会发送窗口关闭事件,除非监听器同时实现了两种类型的接口,那么该监听器就会同时受到两种类型的事件;
iii. 一个事件源可以注册多个监听器:一般符合逻辑的编程思想就是不同监听器监听、处理不同类型的事件,因此对于可以产生多种类型事件的事件源会注册多种类型的监听器,分别负责处理产生的多种事件;
!!当然一个事件源也可以注册多个相同类型的监听器,即比对于同一个事件(按钮单击),事件源注册多个实现ActionListener接口的监听器,那么这些监听器都会受到该事件,可能会疑问,这不是多此一举吗?一种事件就给出一种处理不是很好吗?那是因为有些情况下可能需要一个事件触发多种动作,每个监听器负责实现一个动作;
iv. 一个监听器可以监听多个事件源上的事件,即多个不同的组件用addXxxListener方法注册同一个监听器,那么当不同事件到来时监听器会调用其不同方法进行处理,或者在一个方法内部判断传进来的是什么事件,再进行特殊的处理;
3. 编写事件处理程序的基本流程:
1) 首先需要实现监听器类:自己编写一个类,至少要实现一种类型的监听器接口,并实现接口中所有的事件处理方法;
2) 创建组件,并对组件注册响应的监听器:首先需要创建监听器对象,将监听器对象作为参数传入组件的addXxxListener方法完成注册;
3) 全部工作完成,事件的处理完全自动进行;
4) 简单的示例:处理一个按钮的单击事件
public class AwtTest {Frame f = new Frame("Event Test");TextField tf = new TextField(30);Button ok = new Button("OK");class OkListener implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.out.println("OK button pushed!");tf.setText("Hello!");}}public void init() {f.add(tf);f.add(ok, BorderLayout.SOUTH);ok.addActionListener(new OkListener());f.pack();f.setVisible(true);}public static void main(String[] args) {new AwtTest().init();}}!!完全按照讲述的顺序进行;
!直接设置编辑框内文本的方法:void TextField.setText(String text);
4. 事件源-监听器多对多示例:
public class AwtTest {Frame f = new Frame("Multiple Event Test");TextArea ta = new TextArea(6, 40);Panel p = new Panel();Button btn1 = new Button("button1");Button btn2 = new Button("button2");class Listener1 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubta.append("Listener1 be activated! Event Source:" + e.getActionCommand() + "\n");}}class Listener2 implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubta.append("Listener2 be activated! Event Source:" + e.getActionCommand() + "\n");}}public void init() {f.add(ta);p.add(btn1);p.add(btn2);f.add(p, BorderLayout.SOUTH);Listener1 l1 = new Listener1();Listener2 l2 = new Listener2();btn1.addActionListener(l1);btn2.addActionListener(l1);btn2.addActionListener(l2);f.pack();f.setVisible(true);}public static void main(String[] args) {new AwtTest().init();}}!可以看到按钮2可以同时触发两个监听器,输出两条消息,而监听器1同时监听并处理了两个按钮的消息;
- [疯狂Java笔记]事件处理:Java事件处理模型
- java事件处理模型
- [疯狂Java笔记]事件处理:事件类型、监听器接口、事件适配器
- Java事件处理学习笔记
- java核心技术笔记 事件处理
- JAVA(学习笔记1.2)——事件处理模型
- 初学Java之AWT事件处理模型
- Java自学005事件处理模型
- [疯狂Java]AWT:菜单栏、菜单、菜单项、菜单事件处理
- Java学习笔记--------Java的事件和事件处理接口
- java的事件处理
- Java事件处理模式
- java的事件处理
- java的事件处理
- java的事件处理
- 初识java事件处理
- Java事件处理模式
- java 事件处理演示
- 排序算法-桶排序和计数排序
- 计算几何之凸包----Graham扫描法
- mysql命令大全
- PAT_Basic --- 1004
- java中无参带返回值方法的使用
- [疯狂Java笔记]事件处理:Java事件处理模型
- 详细介绍===优先队列===的用法
- 第二周项目一 宣告主权
- 对类的继承的基本认识
- mysql学习笔记
- Wireshark无代理抓包
- 字典
- 图说Java —— 理解Java机制最受欢迎的8幅图
- OSI七层模型