1.5 Flex的事件机制

来源:互联网 发布:mac的手绘软件 编辑:程序博客网 时间:2024/05/17 07:45
 

1.5  Flex的事件机制

事件处理是GUI开发的重要组成部分,早在传统的Client/Server开发中,事件驱动的开发法就已经是GUI开发的主流。

1.5.1  Flex事件处理

软件开发者在开发过程中只关注某个组件响应某个事件后所做的操作,即被驱动的操作,而不用像结构化线形开发那样去关注驱动事件的动作。响应特定事件的组件叫做事件监听器(Event Listener)。

一个用于交互的GUI组件会被预先定义它可能遇到的事件,软件开发者即可根据开发需求来编写事件监听器,响应部分或全部的事件触发,图1.7展示了这个触发过程。作为开发者,我们首先需要了解特定的GUI交互组件支持哪些事件,之后便可以根据需求写出相应的事件监听器。

图1.7  GUI系统中的事件处理流程

在示例1.2和示例1.3中,我们已经使用到了Flex的事件机制,Flex开发基于ActionScipt对象,事件已经作为Flex可视化组件的属性。我们可以在MXML中直接为组件的事件属性设定事件监听方法或者代码。

在示例1.2中,我们设定<mx:Button>的单击事件(click)属性为click=“changeText()”,并写了一个changeText方法作为单击事件的监听器。这样,当单击Button的时候,就会触发Button的click事件,changeText方法将被调用。而在示例1.3中,我们把ActionScript脚本直接复制给了click,这样整个脚本将作为一个事件监听器。Flex可视化组件开发的事件处理方式与HTML页面开发中的JavaScript脚本使用是非常相似的。

如果我们需要在事件监听器中处理事件源,即产生事件的组件,那么需要为事件监听的方法传递参数event,例如可以对示例1.2中事件监听方法的定义和<mx:Button>的事件属性做一些修改。

(1)  事件监听方法定义的修改:

public function changeText(event:Event):void

(2) Button事件属性的修改:

<mx:Button label="点击这里" fontSize="16" click="changeText(event)"/>

在Button事件属性的修改中,event作为一个关键字来使用,而非自定义变量,因此我们可以在标签中直接使用event来创建当前组件所触发的事件对象。

ActionScript类Event构建的时候会把事件源组件作为一个成员属性,这样在事件监听器中,我们可以通过event来操作事件源组件。

在MXML中设定事件属性值的方式叫做事件监听器内建。这种方式适合应用在简单的事件处理上。如果遇到需要多个事件监听器联合使用等复杂的事件处理情况,则需要应用Flex的事件注册。

1.5.2  Flex事件监听器注册

Flex的可视化组件对象都继承了EventDispatcher类,因此它们都支持事件注册方法addEventListener。该方法的定义如下:

addEventListener(type:String, listener:Function,
useCapture:Boolean = false, priority:int = 0,
useWeakReference:Boolean = false):void

通过addEventListener方法,我们可以为可视化组件注册一个事件监听器。type参数表明事件监听器的类型,如鼠标单击事件(MouseEvent.CLICK);listener参数是事件监听器的具体方法;useCapture参数设定是否在事件的捕获阶段就进行响应;priority参数设定事件监听器的优先级;useWeakReference参数设定事件监听器方法是否为弱类型,一个强类型的事件监听器方法是不会被Flex进行自动垃圾收集的。

先前我们提到的事件监听器内建方式,实际上已经创建了一个默认的事件监听器方法,并把ActionScript脚本的内容写入方法,但这种方法的最大不足就是无法操作一个以上的事件监听器。

而使用addEventListener方法注册事件监听器的方式,我们可以控制事件响应的捕获方式和优先级;当我们已经添加的事件监听器在程序的运行过程中需要取消掉的时候,我们可以通过removeEventListener方法来实现。而这些功能在事件监听器内建方式中不会被支持,理由也很明了:内建的事件监听器都是匿名的,我们无法引用到匿名监听器的监听实体方法。

因此,在使用Flex事件机制的时候,还是应该尽量选用事件监听器注册的方式来构建事件处理,这将为事件交互处理带来更多的可扩展性。

原创粉丝点击