或许每个软件从业者都有从学习控制台应用程序到学习可视化编程的转变过程,控制台应用程序的优点在于可以方便的练习某个语言的语法和开发习惯(如.net和java),而可视化编程的学习又可以非常方便开发出各类人机对话界面(HMI)。可视化编程或许是一个初学者开始对软件感兴趣的开始,也可能是一个软件学习的里程碑点,因为我们可以使用各类软件集成开发环境(IDE)方便的在现成的界面窗口上拖放各类组件(Component),这类组件包括我们常见的按钮(Button),单选按钮(Radio Button),复选框等(Checkbox)。这样的拖放式开发方式不但方便,而且窗口会立竿见影的显示在我们的面前,这对于一个软件初学者而言或许是一件非常有成就感的事情。
但是很多软件学习者在学习可视化开发的过程中,只是非常表面的来理解可视化编程,他们可能认为能够使用拖放方式完成一个界面就非常值得称道,但是很少有人会认真的去理解编程语言对于可视化编程组件的支持和整合,在Softworks软件人才培训中心的两年教学过程,我深刻的感受到了这一点,因此下文将会结合我的教学经验来讲解可视化编程过程中最为关键的“事件驱动模型”。
1.什么是事件驱动模型?
在讲解事件驱动模型之前,我们现在看看事件驱动模型的三大要素:
n 事件源:能够接收外部事件的源体。
n 侦听器:能够接收事件源通知的对象。
n 事件处理程序:用于处理事件的对象。
学员应该要理解任何基于事件驱动模型的开发技术都包含以上三大要素,不管是.net还是java技术,甚至是以前我们使用的Visual Basic和Delphi语言都有基于以上三大要素的事件驱动模型开发流程。
现在我们来看一个生活中的示例,如果有一天你走在路上一不小心被天上掉下来的花瓶砸到了,并且晕死了过去。那么整个过程其实就是一个事件处理流程,而且我们可以非常方便的分析出刚才所提到的事件驱动模型中的三大要素。
1.被砸晕的这个人其实就是事件源,因为他是能够接受到外部的事件的源体。
2.侦听器就是这个人的大脑神经,因为它会感知到疼痛。
3.事件处理就是这个人晕死了过去。
由于事件驱动模型在我们日常生活中是无处不在的,因此Java和其他的编程语言都将这一过程运用到了可视化编程中了。
2.Java编程语言中的事件驱动模型
在Java编程技术中,最常用的可视化编程当属Java Swing技术,Java Swing为开发者提供了很多现成的组件,如:按钮(JButton),单选按钮(JRadioButton)等。为了管理用户与组成程序图形用户界面的组件间的交互,必须理解在Java中如何处理事件。
假设用户单击了程序图形用户界面中的一个按钮,其实该按钮就是这个事件的源(可以引发事件的物体)。所有的Java Swing对象都有感知自己被操作的能力,因此JButton按钮也具有这样能力。一个事件通常必须有一个源对象,这里就是JButton对象。当单击按钮时,JButton组件类会生成一个用于存放该事件参数的ActionEvent的对象,该对象包含了事件及事件源的信息。图1-1显示了这种机制。
图 1-1
当JButton感知到自己被点击以后会将这种感觉传递给某个侦听器对象,该侦听器对象原先已被告知对该类事件感兴趣,侦听器对象仅是一种侦听特定事件的对象。这里的“将事件传递给侦听器”仅意味着事件源调用侦听器对象中的一个特定方法,并以事件对象作为实参。侦听器对象可以侦听一个特定对象的事件(比如一个按钮)。
其实可以使任何类的对象成为侦听器对象,只要使该类实现侦听器接口。你将会发现有各种各样的侦听器接口,以满足不同类型事件的需要。在这个单击按钮的例子中,需要实现ActionListener接口以便接收按钮事件。在侦听器接口声明的方法中,实现了接受这个事件对象并响应该事件的代码。在本例中,在事件发生时,调用了ActionListener接口中的actionPerformed()方法。每种侦听器接口都定义了特定的方法,用来接收该侦听器计划要处理的事件。
仅仅实现侦听器接口还不足以将侦听器对象连接到事件源上,仍需要把侦听器与希望处理的事件单个源或多个源连接起来。通过调用事件源对象的特定方法,可以注册带有事件源的侦听器对象。例如,为了注册侦听单击按钮事件的侦听器,需要调用JButton对象的addActionListener()方法,该操作可以使侦听对象和事件源绑定。
每个事件响应时只涉及到对该事件感兴趣的侦听器。由于侦听器只要求实现一个合适的接口,所以实际上,可以在任何希望的地方接收和处理事件。在Java中使用侦听器对象处理事件的方式,称为委托事件模型,这是因为对于诸如按钮这种组件引起的事件响应,并不是由引起事件的对象本身处理,而是委托独立的侦听器对象进行处理,刚才的actionPerformed()其实就是一个委托处理方法。现在让我们来看一下,JButton是如何将用户的点击转化成方法处理的(如图1-2)。
图1-2
JButton组件初始化代码片断:
private void initialize() {
frame = new JFrame();
frame.getContentPane ().setLayout (null);
frame.setBounds (100, 100, 247, 165);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle ("事件驱动程序");
//btnPress就是这次点击操作中的事件源
btnPress = new JButton();
btnPress.setText ("Press");
btnPress.setName ("Press");
btnPress.setBounds (63, 98, 99, 23);
//向事件源btnPress植入侦听器对象ButtonEventHandler
btnPress.addActionListener (new ButtonEventHandler(this));
frame.getContentPane ().add(btnPress);
frame.getContentPane ().add(txtMessage);
}
侦听器创建的代码片断:
//侦听器对象ButtonEventHandler(用来侦听按钮的点击操作)
class ButtonEventHandler implements ActionListener {
//窗体对象
private EventDemo form = null;
//通过构造体传入窗体对象,
//作用在于让侦听器对象明白事件源处于
//哪个窗体容器中
public ButtonEventHandler(EventDemo form) {
this.form = form;
}
//委托方法
public void actionPerformed(ActionEvent e) {
//该方法将会把事件的处理权交给窗体容器类的
//btnPress_Click方法处理。
this.form.btnPress_Click(e);
}
}
真正的事件处理代码片断:
/**
* 按钮btnPress的事件处理方法。
*
* @param e 事件参数
*/
private void btnPress_Click(ActionEvent e) {
String message = "你点击的按钮名叫:"
+ ((JButton) e.getSource()).getName();
this.txtMessage.setText(message);
}
按钮的事件处理程序代码片断:
代码工作原理:
JButton组件初始化代码片断已经明确阐述了按钮被创建后放置于窗体上,关键在于本代码片断的以下语句:
btnPress.addActionListener(new ButtonEventHandler(this));
该语句就是向事件源植入了侦听器对象ButtonEventHandler,该类实现了ActionListener结构,因此JButton类的对象btnPress这个时候已经具有了处理用户点击按钮的能力了。
当用户点击btnPress这个按钮的时候,按钮对象会直接把这次点击感觉传递给ButtonEventHandler的actionPerformed方法处理,为养成较好的编程习惯,我们中心并不建议学员直接在该委托方法中编写代码,而是需要将该事件处理再次转发给窗体中的某个方法来处理,这个方法的命名也必须是有规则的,就是事件源名+下划线+事件名(btnPress_Click),并且该方法必须具有事件参数ActionEvent,因为在该对象中明确指明了,哪个按钮受到了点击了。e.getSource()方法返回了被点击按钮的对象,由于这次被点击的是一个按钮,因此我们需要使用JButton对e.getSource()的返回值进行强转,随后通过getName()方法得到这个按钮的名字。至此整个点击事件处理完了。
这篇文章主要的作用是为了阐述Java的事件处理机制,至于侦听器和事件源的内部工作原理,将会在我的下一篇技术文章《Java的观察者模式》中详细讲解,待续……
分享到:
相关推荐
本文将深入探讨Java中事件驱动模型的应用,特别是通过Swing框架的具体实例来解析这一概念。 ### 一、什么是事件驱动模型? 事件驱动模型的核心理念在于,程序不是按顺序执行的,而是对发生的事件作出反应。当某个...
《J2EE经典实例详解》是一本专注于Java企业级应用开发的实践指南,它通过一系列精选的实例,帮助开发者深入理解和熟练运用J2EE技术。J2EE(Java 2 Platform, Enterprise Edition)是Java平台的企业版,为构建分布式...
最后,书中也会涉及到Android应用程序接口(API)与底层驱动的交互,如何通过JNI(Java Native Interface)调用C/C++库,实现Java代码与驱动程序的通信。这部分内容对于开发系统级应用或扩展Android功能的开发者尤为...
8.1.4 本地协议的纯java驱动程序 256 8.2 安装数据库 256 8.3 jdbc api 260 8.3.1 加载并注册数据库驱动 261 8.3.2 建立到数据库的连接 263 8.3.3 访问数据库 264 8.3.4 事务处理 289 8.3.5 可滚动和可更新的...
"Java三种IO模型原理实例详解" Java中的IO模型可以分为三种:BIO(同步阻塞)、NIO(同步非阻塞)和AIO(异步非阻塞)。每种模型都有其特点和应用场景。 BIO(同步阻塞) BIO是最古老的IO模型,在JDK1.4之前都是...
在这个实例详解中,我们将深入探讨这两者如何协同工作以构建一个功能完善的Web应用。 首先,让我们从`.classpath`文件开始,这是Eclipse或MyEclipse等IDE的工作空间配置文件,它包含了项目所需的库和类路径信息。在...
EJB是J2EE中的核心组件模型,分为三种类型:会话bean(Session Beans)处理客户端交互,实体bean(Entity Beans)持久化数据,消息驱动bean(Message-Driven Beans)用于处理JMS(Java Message Service)消息。...
**J2EE经典实例详解(1-100)** J2EE,全称为Java 2 Platform, Enterprise Edition,是Java平台的企业版,主要用于构建分布式、多层的企业级应用程序。这个平台提供了丰富的服务和组件,包括但不限于:Servlet、JSP...
本实例详解课程旨在帮助学习者深入理解并掌握Java EE的各项核心技术,通过实际操作来提升开发能力。 课程涵盖的主要章节包括: 1. **第一章:Java EE基础** (ch1 jee6essentialworkspace.rar) 在这一章中,你将...
**J2EE经典实例详解** J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专门针对企业级应用开发。它提供了一个多层架构的框架,用于构建可扩展、安全且易于维护的分布式应用程序。J2EE平台包含...
8.1.4 本地协议的纯java驱动程序 256 8.2 安装数据库 256 8.3 jdbc api 260 8.3.1 加载并注册数据库驱动 261 8.3.2 建立到数据库的连接 263 8.3.3 访问数据库 264 8.3.4 事务处理 289 8.3.5 可滚动和可更新的...
总的来说,《J2EE经典实例详解12》是一本全面涵盖J2EE技术的教程,适合有一定Java基础,希望深入理解和应用J2EE技术的开发者阅读。通过书中的实例,读者不仅可以深化理论知识,还能提高实际开发能力,为构建复杂的...
**J2EE经典实例详解** J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专门针对企业级应用开发。它提供了一个全面的框架来构建分布式、多层的、面向服务的架构,包括Web组件、EJB(Enterprise ...
《J2EE经典实例详解3》是一本深入探讨J2EE技术的书籍,其核心内容是通过具体的实例来解析J2EE平台上的开发实践。J2EE,全称为Java 2 Platform, Enterprise Edition,是Oracle公司提供的一个用于构建企业级分布式应用...
《J2EE经典实例详解》是一本专注于J2EE技术实践的书籍,旨在通过一系列典型的应用实例,深入浅出地解析J2EE平台的核心技术和开发流程。J2EE(Java 2 Platform, Enterprise Edition)是Java平台的企业版,主要用于...
8.1.4 本地协议的纯java驱动程序 256 8.2 安装数据库 256 8.3 jdbc api 260 8.3.1 加载并注册数据库驱动 261 8.3.2 建立到数据库的连接 263 8.3.3 访问数据库 264 8.3.4 事务处理 289 8.3.5 可滚动和可更新的...
《J2EE经典实例详解4》是一本深入探讨J2EE技术的专著,通过一系列经典实例,旨在帮助读者理解并掌握J2EE平台的核心技术和应用。J2EE(Java 2 Platform, Enterprise Edition)是Java开发企业级应用程序的框架,它提供...
8.1.4 本地协议的纯java驱动程序 256 8.2 安装数据库 256 8.3 jdbc api 260 8.3.1 加载并注册数据库驱动 261 8.3.2 建立到数据库的连接 263 8.3.3 访问数据库 264 8.3.4 事务处理 289 8.3.5 可滚动和可更新的...
### Java事件原理详解 在Java中,事件处理机制是一种基于观察者模式的事件驱动编程模型。这一机制使得组件能够在特定的事件(如按钮点击、键盘输入等)发生时通知其注册的监听器,从而实现对事件的响应。下面将详细...