Java事件驱动模型
2009-6-22
最近复习基础功课之余研究了下下Java
主要看了Java的事件处理机制,感觉收获很大;加强了对于类的继承和接口的理解,特别的,对于接口的了解使我对对象的多态性理解更深。
而且,我做了一个综合实践例程测试了自定义的事件处理还有系统事件处理;
首先需要明确的几个概念
事件源:产生事件的对象;
事件处理器(监听器):负责处理事件的方法。
事件对象:用于在事件源与事件处理器间传递信息的桥梁。
它们之间的关系就是对事件源设置监听器来观察事件源的事件(也可以说是变化)然后采取相应的处理。
这就是Java AWT事件处理机制----称作观察者模式(observer)或监听模型
以下是我的一些见解,跟大家共享(也便于刚刚JAVA入门的朋友对这部分开窍,少走弯路,我摸索的其实挺辛苦的到处翻资料O(∩_∩)O~)
监听模型可以理解成成订阅 / 发送模型
就是一些监听者对于事件源(主人公或被监听者)的一些事件感兴趣,然后就在事件源中注册下自己就相当于订阅了事件源的事件,所谓注册就是给事件源拷贝一份自己的引用(就相当于告诉事件源自己的地址)
然后事件源发现该监听者感兴趣的事件发生了他就根据在这注册(订阅)的监听者的地址去告诉他事件发生了,该干嘛干嘛吧(就相当于让他他们去处理该事件了)然后不同的人有不同的处理
举个现实中的例子
例如,一个女生作为事件源,他有时候会心情不好,这就可以看做一个事件。一般她会对谁说呢?也就是说一般有谁去听她说呢,嗯,有父母,有朋友,还有男朋友。这些就可以被称作监听者,但是关系是需要建立,父母的建立(当然父母生你时就已经建立关系了这里暂且这么说)朋友的建立男友的建立,这些就相当于注册或者说订阅。然后某一天,女孩很不高兴,就说了“我很不高兴”(事件的描述)他分别对已经建立关系的父母,朋友,男友说了,然后父母,朋友,男友听到分别作出相应的反应(比如母亲安慰一下,朋友逗笑一下,男友送点礼物什么的)这就是整个事件模型的过程
同时可以解释下接口,书上对接口的解释是,他规定一个类必须做什么,而不是指定他做的细节,也就是说他定义一类事,由继承类实现,他并不关心你用什么方式实现,而是关心你是否实现了。(所以,如果你的继承类没有重写所有的接口中定义的方法,编译器就会报错,所以还引入了适配器的概念为了不打乱文章结构这里不再赘述)
在上述的例子中,接口就可以理解为女孩说出事件后,心里所想要的,但是并不确定,她只是想“你们们得对我的不高兴作出反应(不管你们作出什么反应)”
然后每个人在收到事件时分别作出了自己的反应,完成女孩的(隐式)要求)。
所以说接口可以看做一种要求,反正你就得做我要求的事,不论你用什么方式。
下面给出模型的程序实现
1、首先要定义自定义的事件类
MyXXXEvent 事件类都要从EventObject继承
事件类定义了一些传递事件需要的信息(其实就类似Win32中的消息就好比上面例子中的“我很不高兴”)另外它还从EventObject继承了事件源的传递
2、然后定义监听器接口MyXXXEventListener 抽象了一个消息处理的方法(定义要求了哦)
3、然后要在事件源类中建立一个监听器列表MyXXXListers
并且实现注册监听器的方法AddXXXEventListener(MyXXXEventListener e);
他的作用是把监听器类加入到监听器列表中
4、然后事件源类中还要加入事件报告方法FireXXXEvent()
他的作用是判断事件是否发生,如果发生了,遍历监听器列表然后调用所有监听器的处理方法。
5、最后就是设计监听器列表了当然要继承MyXXXEventListener接口而且要重载处理方法;
整个模型就是这样的
实例化时将监听器类用AddXXXEventListener(MyXXXEventListener e);注册到事件源类中
整个事件系统就能运行了
下面是我的事件模型设计代码
就是一个小窗口有一个文本框一个按钮三个标签
你在文本框中输入内容然后按按钮
如果你输入的内容中出现了三个标签中的名字,对应的他们就说说一句“喊我干嘛”
这里定义了三个监听者他们只处理自己感兴趣的内容就是自己的名字;
图片如下
代码如下
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;
/**
* @(#)java事件处理机制试验程序
* 作者:高嵩
* @version 1.00 2009/6/19
*/
interface MyEventListener extends java.util.EventListener{
public abstract void EventHandle(MyEvent e);
}
class MyEvent extends java.util.EventObject{
public String szTxt;
public MyEvent(Object Source)
{
super(Source);
}
}
class MainFrm extends JFrame implements ActionListener{
private Vector Mylisteners=new Vector();
public JButton btn1;
public JLabel lb1,lb2,lb3;
public JTextField txt1;
public MainFrm()//创建窗口及相关的组件
{
super("事件驱动实例");
Container contentpane=this.getContentPane();
txt1=new JTextField(10);
btn1=new JButton("确定");
lb1=new JLabel("卡儿朵麦");
lb2=new JLabel("高嵩");
lb3=new JLabel("海瑞");
lb1.setToolTipText("。。。!");
Panel mpanel=new Panel();
mpanel.setLayout(new GridLayout(4,1,5,5));
Panel pl1=new Panel();
pl1.add(txt1);
pl1.add(btn1);
Panel pl2=new Panel();
Panel pl3=new Panel();
Panel pl4=new Panel();
pl2.add(lb1);
pl2.setLayout(new FlowLayout(FlowLayout.LEFT));
pl3.add(lb2);
pl3.setLayout(new FlowLayout(FlowLayout.LEFT));
pl4.add(lb3);
pl4.setLayout(new FlowLayout(FlowLayout.LEFT));
mpanel.add(pl1);
mpanel.add(pl2);
mpanel.add(pl3);
mpanel.add(pl4);
btn1.addActionListener(this);
contentpane.add(mpanel);
pack();
setVisible(true);
}
//BUTTON点击事件响应方法
public void actionPerformed(ActionEvent e){
MyEvent evt=new MyEvent(this);
this.lb1.setText("卡儿朵麦");
this.lb2.setText("高嵩");
this.lb3.setText("海瑞");
evt.szTxt=txt1.getText();
fireMyEvent(evt);
}
//加入自定义事件侦听器方法
public synchronized void addMyEventListener(MyEventListener mel)
{
Mylisteners.addElement(mel);
}
//报告事件
public void fireMyEvent(MyEvent e)
{
Vector currentlist=null;
synchronized(this){
currentlist = (Vector)Mylisteners.clone();
}
for(int i=0;i<currentlist.size();i++)
{MyEventListener listener=(MyEventListener)currentlist.elementAt(i);
listener.EventHandle(e);}
}
}
//事件监听器1
class NameListener1 implements MyEventListener{
MainFrm mf;
public void EventHandle(MyEvent e){
String c=e.szTxt;
if(c.indexOf("卡儿朵麦")!=-1)
{
mf=(MainFrm)e.getSource();
mf.lb1.setText(mf.lb1.getText()+":喊我干嘛?");
}
}
}
//事件监听器2
class NameListener2 implements MyEventListener{
MainFrm mf;
public void EventHandle(MyEvent e){
String c=e.szTxt;
if(c.indexOf("高嵩")!=-1)
{
mf=(MainFrm)e.getSource();
mf.lb2.setText(mf.lb2.getText()+":喊我干嘛?");
}
}
}
//事件监听器3
class NameListener3 implements MyEventListener{
MainFrm mf;
public void EventHandle(MyEvent e){
String c=e.szTxt;
if(c.indexOf("海瑞")!=-1)
{
mf=(MainFrm)e.getSource();
mf.lb3.setText(mf.lb3.getText()+":喊我干嘛?");
}
}
}
//程序主类
public class myEventDemo {
public static void main (String[] args) {
MainFrm frame=new MainFrm();
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}
);
frame.addMyEventListener(new NameListener1());
frame.addMyEventListener(new NameListener2());
frame.addMyEventListener(new NameListener3());
}
}
分享到:
相关推荐
在Java开发领域,事件驱动模型(Event-Driven Model)是一种广泛采用的设计模式,它通过响应外部事件来触发程序中的特定行为。本文将深入探讨Java中事件驱动模型的应用,特别是通过Swing框架的具体实例来解析这一...
### 事件驱动模型实例详解(Java篇) #### 1. 事件驱动模型概念解析 事件驱动模型是现代软件开发中一种关键的编程模式,尤其在图形用户界面(GUI)编程中占据核心地位。该模型围绕三个核心概念构建:事件源、侦听...
- **自定义事件和监听器**:除了内置的事件和监听器,开发者还可以根据需求自定义事件类和监听器接口,以扩展事件驱动模型。 在实际编程中,我们可以通过以下步骤实现事件驱动: 1. 创建事件源,如按钮、文本框等...
Spring框架是Java开发中广泛应用的一个开源框架,它提供了一种事件驱动模型来增强应用程序的组件之间的通信。在本文中,我们将深入探讨Spring事件驱动模型,理解其工作原理,并通过源码分析来深化认识。 首先,...
事件驱动模型是一种软件设计模式,它基于异步通信和消息传递的概念来构建应用程序。在这种模型中,系统的行为是由发生的事件来触发的,而不是由预先设定的顺序执行的指令。事件可以是用户操作、硬件状态改变、定时器...
例如,Java NIO(非阻塞I/O)库就使用了事件驱动模型,通过Selector监听多个通道上的事件,实现高效的I/O操作。 总的来说,Java事件驱动编程是构建交互式应用程序的关键技术,通过分离事件生成和事件处理,使程序...
### Java事件驱动模型详解 #### 一、引言 随着软件开发技术的不断发展,事件驱动模型成为了构建用户界面的关键组成部分之一。无论是对于.NET还是Java这样的现代编程语言来说,理解和掌握事件驱动模型都是非常重要...
此程序在j2se下编写,主要用于熟练: 1. java基本语法例如:表达式,语句,变量声明,基本数据类型及类型转换等;...java事件驱动模型及其使用方法。 5. 熟悉MyEclipse IDE环境的基本使用。jdk的安装及环境变量的设定。
在Java编程语言中,事件驱动是一种常见的编程模型,它主要用于构建用户界面(UI)应用程序,如桌面应用或网页应用。这种模型中,程序并不主动执行某个任务,而是等待用户的操作,比如点击按钮、输入文本等,这些用户...
在编程领域,事件驱动风格和观察者模式是两种常见的设计模式,它们在Java开发中有着广泛的应用。这两种模式主要用于处理异步数据处理和组件之间的通信,使得程序更加灵活且易于维护。 事件驱动风格是一种编程范式,...
在Spring框架中,事件驱动模型主要由三部分组成:事件(Event)、事件监听器(EventListener)和事件发布者(EventPublisher)。当某个组件发生特定事件时,它会创建一个事件对象并将其发布给感兴趣的监听器,这些...
Java引入了一种更高级的事件处理模型,旨在提高代码的可维护性和降低组件间的耦合度,使其更接近于网站开发的模式。 Java事件处理主要基于观察者模式(Observer Pattern),在这种模式中,事件源(通常是GUI组件,...
在本案例中,可能是使用了Spring MVC,它提供了注解驱动的控制器,模型绑定,以及视图解析等功能,极大地提高了开发效率。 5. **案例分析** 假设我们的项目是一个在线购物平台,`Demo`目录下的文件可能包含了以下...
Java事件模型主要基于观察者模式(Observer Pattern),在这个模型中,事件源(通常是GUI组件)是被观察的对象,而事件监听器则是观察者。当事件源发生特定事件时,会通知注册的监听器,调用监听器中的相应方法。...
JAVA-DDD/领域驱动模型
在Java中,事件处理机制是一种基于观察者模式的事件驱动编程模型。这一机制使得组件能够在特定的事件(如按钮点击、键盘输入等)发生时通知其注册的监听器,从而实现对事件的响应。下面将详细阐述Java事件驱动原理的...
什么是领域(Domain)? 我们所做的软件系统的目的都是来解决一系列问题,例如做一个电商系统来在线销售自己企业的产品;做一个灰度发布平台来提升服务的质量和稳定性。任何一个系统都会属于某个特定的领域,例如: ...
总结来说,"java领域模型代码示例"提供了一个基于Java的、使用领域驱动设计的实践案例,有助于开发者理解和学习如何将业务逻辑转化为可维护的代码结构。通过分析和学习这样的示例,开发者可以提升在复杂业务场景下...
Datastax Java Driver是Cassandra数据库的一个官方Java客户端驱动,由DataStax公司开发和维护。这个驱动程序允许Java开发者高效、稳定地与Apache Cassandra或DataStax Enterprise (DSE)进行交互。在这个压缩包中,...
订阅推送是发布订阅模型的一种具体应用,通常出现在消息队列(MQ)、事件驱动架构或实时数据流处理中。例如,RabbitMQ、Kafka等消息中间件就支持这种模型,允许应用程序之间通过消息进行通信,而不直接调用对方的API...