2.1.1. 问题
我想执行一段任务以便对用户的交互作出响应,比如当用户点击一个按钮时在控制台输出名称列表。
2.1.2. 解决办法
使用<mx:Button>标签的click 事件属性来设定一个click 事件处理程序。也可以在ActionScript 中通过Button 实例的addEventListener 方法来添加click 事件的检查器来达到同样的效果。
2.1.3. 讨论
如下的代码展示了如何在MXML 中是用<mx:Button>的click 事件属性来检查一个按钮行为:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical">
<mx:Button id="btn" label="Show Names" click="showNames(event)"/>
<mx:Script>
<![CDATA[
private function showNames(evt:MouseEvent):void
{
var temp:Array =
new Array("George","Tim","Alex","Dean");
trace(temp.toString());
}
]]>
</mx:Script>
</mx:Application>
上面的代码创建了一个包含名为btn 的按钮控件实例的应用程序。当这个btn 的按钮实例被点击时,应用程序会输出一列名字到控制台。可以看到btn 这个按钮的click 事件属性指向了一个方法showNames:
+展开
-XML
<mx:Button id="btn" label="Show Name click="showNames(event)"/>
每当用户点击这个按钮,Flex 框架会发布一个MouseEvent.CLICK 事件。上面这行代码设定了在每次click 事件被发布的时候,都去调用showNames 方法,然后一个名字的数组就被创建以及输出到了控制台中。需要注意的是,MouseEvent 类型的事件实例会被自动传递到处理的函数。根据发出的事件,查询此对象可以获得更多关于该事件本身的信息。在调试模式(Eclipse 中F11)中运行程序,你就会看到控制台窗口有如下输出。
George,Tim,Alex,Dean
事件检查器也能通过ActionScript 来设定。下面的例子就是使用ActionScript 设定了showNames 和showTitles 两个检查器到btn 这个按钮实例。
+展开
-XML
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml"
layout="vertical"
creationComplete="initApp(event);">
<mx:Button id="btn" label="Show Names"/>
<mx:Script>
<![CDATA[
import mx.events.FlexEvent;
private function initApp(evt:FlexEvent):void
{
btn.addEventListener(MouseEvent.CLICK,showNames);
btn.addEventListener(MouseEvent.CLICK,showTitles);
}
private function showNames(evt:MouseEvent):void
{
var temp:Array =
new Array("George","Tim","Alex","Dean");
trace(temp.toString());
}
private function showTitles(evt:MouseEvent):void
{
var temp:Array = new Array("Director","Vice-
President","President","CEO");
trace(temp.toString());
}
]]>
</mx:Script>
</mx:Application>
注意,<mx:Application>的creationComplete 事件用来设定了按钮点击事件的2 个检查器,showNames 和showTitles.
+展开
-ActionScript
private function initApp(evt:FlexEvent):void
{
btn.addEventListener(MouseEvent.CLICK,showNames);
btn.addEventListener(MouseEvent.CLICK,showTitles);
}
Running this application in debug mode generates the following output in the Console window:
在调试模式中运行这个程序,控制台窗口会输出如下内容:
George,Tim,Alex,Dean
Director,Vice-President,President,CEO
检查器根据被注册时的顺序进行调用。因为showNames 比较showTitles 早注册检查,所以名字列表比标题列表先生成输出。如果要改变他们(检查器)的执行顺序,可以修改他们对按钮注册事件检查的顺序。甚至,你可以在注册检查器时设定它们的优先级,例如下面的代码:
+展开
-ActionScript
private function initApp(evt:FlexEvent):void
{
btn.addEventListener(MouseEvent.CLICK,showNames);
btn.addEventListener(MouseEvent.CLICK,showTitles);
}
使用修改后的代码,再次在调试模式中运行程序,我们可以看到:
Director,Vice-President,President,CEO
George,Tim,Alex,Dean
使用大的优先级值(priority)注册的检查器会比使用小优先级的优先级注册的检查器更早的运行。如果有超过一个检查器适用了相同的优先级值,则执行顺序还是依照检查器注册的顺序。