Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 775|回复: 0

可视化编程之“事件驱动模型”

[复制链接]

该用户从未签到

发表于 2011-10-18 20:13:50 | 显示全部楼层 |阅读模式
可视化编程过程中最为关键的“事件驱动模型”
  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 (&quotress");

        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的事件处理机制,至于侦听器和事件源的内部工作原理,待续……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-18 13:42 , Processed in 0.389558 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表