7.使用MXML来实现事件处理机制:用一个例子来演示。
<1>首先创建一个MXML Component文件,使用已有的ActionScript组件来组装一个自定义的组件。
其实就是创建一个新类,继承已经存在的组件(如Panel),然后在自定义类中封装几个已存在的组件作为属性,以组成自己的类!!
<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="后台管理">
<mx:Label x="41" y="30" text="用户名:"/>
<mx:Label x="41" y="76" text="密 码:"/>
<mx:TextInput id="t_username" x="119" y="28" borderColor="#0B65A4" backgroundColor="#CE6363" backgroundAlpha="0.18"/>
<!-- displayAsPassword="true"表示输入密码后用黑点儿显示 -->
<mx:TextInput id="t_password" x="119" y="76" displayAsPassword="true" borderColor="#0B65A4" backgroundColor="#CE6363" backgroundAlpha="0.18"/>
<!-- 为按钮注册鼠标点击监听器事件方法clickButton -->
<mx:Button x="119" y="123" label="登陆" width="72" click="clickButton()"/>
<!-- 这里不是为该自定义组件注册一个Event事件,而是指定该组件可以注册这个事件,事件类型叫做"login" -->
<mx:Metadata>
[Event (name="login", type="flash.events.Event")]
</mx:Metadata>
<!-- 点击按钮触发事件方法后,为整个自定义组件的事件流中添加一个新的上边声明了的login类型的事件
此事件添加到事件流后,如果自定义组件或子节点组件有注册login类型的监听器,那么会立即触发-->
<mx:Script>
<![CDATA[
internal function clickButton():void{
//向这个组件的事件流中制造一个新的事件,以便可以触发对应的监听器
this.dispatchEvent(new Event("login"));
}
]]>
</mx:Script>
</mx:Panel>
*说明:因为表单有登陆按钮对象,所以要为按钮注册一个"登陆事件‘(即鼠标点击事件),
当点击时当然就会触发事件监听方法,进而完成对应的功能(判断用户名、密码等)。
*注意: 这样一个自定义组件不能独立运行,只能供一个MXML文件引用而使用。
所以是否触发login类型的事件要看引用该组件对象的MXML文件中的声明了。见下边!!
<2>在MXML文件中引入自定义组件,使用<ns1:LoginForm>元素引用(也可以从组件视图上拖动)。
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" xmlns:ns1="*">
<!-- 事件监听方法,当自定义组件有login类型的事件发生时,就会调用loginClick()方法 -->
<mx:Script>
<![CDATA[
import mx.controls.Alert;
//监听器方法
internal function loginClick(evt:Event):void{
Alert.show("登陆成功","提示");
}
]]>
</mx:Script>
<!-- 在MXML中引入自定义组件,并且为组件注册login类型的事件监听器,监听方法为loginClick,参数一定要传入event对象,
之所以要传入参数是因为声明的事件监听方法要接收这个参数 -->
<ns1:LoginForm id="loginForm" login="loginClick(event)" verticalAlign="middle">
</ns1:LoginForm>
* 说明:login="loginClick(event)"中的login是事件类型,而loginClick则是事件监听器方法
</mx:Application>
<3>总结: 上边例子中,首先在自定义组件中为自定义组件声明了一个可以使用的事件类型"login",
然后为自定义组件中的按钮的鼠标点击事件注册监听器方法为clickButton()方法,方法体中是为自定义组件的事件流中制造一个login类型的事 件。
也就是说运行时,点击按钮后,会触发clickButton方法,然后该方法为自定义组件事件流中制造一个新的login事件,
这回导致注册了 login事件类型的监听器被调用,即loginClick被调用。这是上边例子点击登陆后的操作流程。
<4>上边为自定义组件声明的事件类型都是ActionScript提供的事件Event类型的,我们当然也可以想在 ActionScript中那样,定义自定义的事件类型。
//自定义事件类型
public class LoginEvent extends Event{
//保存用户名
public var username:String;
//保存密码
public var password:String;
public function LoginEvent(type:String){
super(type, false, false);
}
}
*修改<1>中代码:
<mx:Metadata>
<!-- type的值改成了自定义事件类型 -->
[Event (name="login", type="com.events.LoginEvent")]
</mx:Metadata>
<mx:Script>
<![CDATA[
import com.events.LoginEvent;
internal function clickButton():void{
//创建自定义事件对象,并且指定类型名为"login"
var loginEvent:LoginEvent = new LoginEvent("login");
//得到用户名值
loginEvent.username = t_username.text;
//得到密码值
loginEvent.password = t_password.text;
//向事件流中制造事件
this.dispatchEvent(loginEvent);
}
]]>
</mx:Script>
*修改<2>中代码:
//此处参数类型改成了LoginEvent自定义类型,如果不改将会得不到 username和password属性值
internal function loginClick(evt:LoginEvent):void{
//判断用户名和密码
if((evt.username == "admin") && (evt.password == "admin")){
Alert.show(" 登陆成功","提示");
return;
}
Alert.show("登陆失败","警告");
}
*说明:其实我们可以直接在按钮的鼠标点击事件中进行表单的验证,不过如果这样代码的复用能力就比较差,
因为我们可能会在很多地方都会使用自定义组件,如果验证写在鼠标单击按钮事件方法中,那么在每一次引用自定义组件后,
如果各个需求的验证方法不同,那么就要总是修改自定义组件的鼠标点击事件方法中的代码了。
而向上边那样写,就无需修改自定义组件中的代码了。
posted on
2010-05-11 16:53
念时
阅读(
738)
评论()
编辑
收藏
举报