Flex经验谈---用事件模拟一个Flex内部消息机制

       告示:本文为原创文章, 如果转载请注明出处!http://summerofthatyear-gmail-com.javaeye.com/admin/blogs/328259
     看到消息不要头皮发麻, 这只是我自己随便瞎起的名字. 其实就是一个"单件类"继承了flash.events.EventDispatcher, 因此实现了发送和侦听事件(消息)的功能.是不是挺神奇的~~~^-^
      听不懂没关系, 举个例子就一目了然了.
      这个例子很简单, 是一个选择用户的模块, 就是一个TextArea和一个Button, 点击Button弹出一个TitleWindow(PopUpManager). TitleWindow有一个DataGrid, 然后在DataGrid里面选择一个用户返回;
      首先是一个用户对象:

Java代码
  1. package com.montage.vo  
  2. {  
  3.     /** 
  4.      * @author Montage 
  5.      */   
  6.     public class User  
  7.     {  
  8.         public function User()  
  9.         {  
  10.         }  
  11.           
  12.         public var name:String;  
  13.         public var country:String;  
  14.   
  15.     }  
  16. }  
package com.montage.vo
{
	/**
	 * @author Montage
	 */	
	public class User
	{
		public function User()
		{
		}
		
		public var name:String;
		public var country:String;

	}
}



选择完了用户, 所需要的事件

Java代码
  1. package com.montage.events  
  2. {  
  3.     import com.montage.vo.User;  
  4.       
  5.     import flash.events.Event;  
  6.   
  7.     /** 
  8.      * @author Montage 
  9.      */   
  10.     public class UserEvent extends Event  
  11.     {  
  12.         public static var SELECTED_USER:String = "selectedUser";  
  13.           
  14.         public var user:User;  
  15.           
  16.         public function UserEvent(type:String,  
  17.                                   bubbles:Boolean=false,   
  18.                                   cancelable:Boolean=false)  
  19.         {  
  20.             super(type, bubbles, cancelable);  
  21.         }  
  22.     }  
  23. }  
package com.montage.events
{
	import com.montage.vo.User;
	
	import flash.events.Event;

	/**
	 * @author Montage
	 */	
	public class UserEvent extends Event
	{
		public static var SELECTED_USER:String = "selectedUser";
		
		public var user:User;
		
		public function UserEvent(type:String,
								  bubbles:Boolean=false, 
								  cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}
	}
}




下面这个类最重要了, 它继承EventDispatcher负责派发和注册事件, 他是一个"单件类"所以可以做到总是只有一个实例. send()方法用来发送消息(事件).

Java代码
  1. package com.montage.model  
  2. {  
  3.     import flash.events.Event;  
  4.     import flash.events.EventDispatcher;  
  5.       
  6.     //  
  7.     //  
  8.     // events  
  9.     //  
  10.     //  
  11.     /** 
  12.      * 给当前类注册一个事件 
  13.      */   
  14.     [Event(name="selectedUser", type="com.montage.events.UserEvent")]  
  15.   
  16.     /** 
  17.      *  
  18.      * @author Montage  
  19.      */   
  20.     public class EventMessage extends EventDispatcher  
  21.     {  
  22.           
  23.         private static var instance:EventMessage = null;  
  24.           
  25.         public function EventMessage()  
  26.         {  
  27.             if( instance != null )  
  28.             {  
  29.                 throw new Error("EventMessage是一个单件类,只能被实例化一次!");  
  30.             }  
  31.         }  
  32.           
  33.         public static function getInstance():EventMessage  
  34.         {  
  35.             if( instance == null )  
  36.             {  
  37.                 instance = new EventMessage();  
  38.             }  
  39.             return instance;  
  40.         }  
  41.           
  42.         /** 
  43.          * 发送各种类型事件(消息) 
  44.          * @param event 
  45.          */       
  46.         public function send( event:Event ):void  
  47.         {  
  48.             dispatchEvent( event );  
  49.         }  
  50.   
  51.     }  
  52. }  
package com.montage.model
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	
	//
	//
	// events
	//
	//
	/**
	 * 给当前类注册一个事件
	 */	
	[Event(name="selectedUser", type="com.montage.events.UserEvent")]

	/**
	 * 
	 * @author Montage 
	 */	
	public class EventMessage extends EventDispatcher
	{
		
		private static var instance:EventMessage = null;
		
		public function EventMessage()
		{
			if( instance != null )
			{
				throw new Error("EventMessage是一个单件类,只能被实例化一次!");
			}
		}
		
		public static function getInstance():EventMessage
		{
			if( instance == null )
			{
				instance = new EventMessage();
			}
			return instance;
		}
		
		/**
		 * 发送各种类型事件(消息)
		 * @param event
		 */		
		public function send( event:Event ):void
		{
			dispatchEvent( event );
		}

	}
}



以下是用户列表界面UserList.mxml

Xml代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="400" height="300" title="选择用户">  
  3.     <mx:Script>  
  4.         <![CDATA[ 
  5.             import mx.controls.Alert; 
  6.             import com.montage.events.UserEvent; 
  7.             import com.montage.vo.User; 
  8.             import com.montage.model.EventMessage; 
  9.             import mx.managers.PopUpManager; 
  10.              
  11.             private var eMessage:EventMessage = EventMessage.getInstance(); 
  12.              
  13.             private function submitHandler():void 
  14.             { 
  15.                 if( grid.selectedIndex > -1 ) 
  16.                 { 
  17.                     var item:XML = XML( grid.selectedItem ); 
  18.                      
  19.                     //创建一个用户 
  20.                     var user:User = new User(); 
  21.                     user.name = item.@name; 
  22.                     user.country = item.@country; 
  23.                      
  24.                     //创建一个UserEvent事件, 把刚刚创建好的user赋给它 
  25.                     var event:UserEvent = new UserEvent( UserEvent.SELECTED_USER ); 
  26.                     event.user = user; 
  27.                      
  28.                     //用EventMessage将这个事件发送出去 
  29.                     eMessage.send( event ); 
  30.                     cancelHandler(); 
  31.                 } 
  32.                 else 
  33.                 { 
  34.                     Alert.show("请选择一个用户!"); 
  35.                 } 
  36.             } 
  37.              
  38.             private function cancelHandler():void 
  39.             { 
  40.                 PopUpManager.removePopUp( this ); 
  41.             } 
  42.         ]]>  
  43.     </mx:Script>  
  44.     <mx:XML id="users" source="user.xml"/>  
  45.     <mx:DataGrid id="grid" width="100%" height="100%" dataProvider="{users.User}">  
  46.         <mx:columns>  
  47.             <mx:DataGridColumn headerText="姓名" dataField="@name"/>  
  48.             <mx:DataGridColumn headerText="国家" dataField="@country"/>  
  49.         </mx:columns>  
  50.     </mx:DataGrid>  
  51.     <mx:ControlBar width="100%">  
  52.         <mx:Spacer width="100%"/>  
  53.         <mx:Button label="确定" click="submitHandler()"/>  
  54.         <mx:Button label="取消" click="cancelHandler()"/>  
  55.     </mx:ControlBar>  
  56. </mx:TitleWindow>  



用户数据源user.xml

Xml代码
  1. <root>  
  2.     <User name="David" country="America"/>  
  3.     <User name="Tome" country="Canada"/>  
  4.     <User name="Montage" country="China"/>  
  5. </root>  



请界面:

Xml代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" creationComplete="init()" fontSize="12">  
  3.     <mx:Script>  
  4.         <![CDATA[ 
  5.             import com.montage.events.UserEvent; 
  6.             import com.montage.model.EventMessage; 
  7.             import mx.managers.PopUpManager; 
  8.             import com.montage.view.user.UserList; 
  9.              
  10.             private var eMessage:EventMessage = EventMessage.getInstance(); 
  11.              
  12.             private function init():void 
  13.             { 
  14.                 eMessage.addEventListener(UserEvent.SELECTED_USER, selectedUserHandler); 
  15.             } 
  16.              
  17.             /** 
  18.              * 选择好以后的反馈 
  19.              */ 
  20.             private function selectedUserHandler( event:UserEvent ):void 
  21.             { 
  22.                 textArea.htmlText = "你选择了:<b>" + event.user.name + "</b>("+ event.user.country +")"; 
  23.             } 
  24.              
  25.             /** 
  26.              * 弹出选择用户的窗口PopUpManager 
  27.              */ 
  28.             private function clickHandler():void 
  29.             { 
  30.                 var userList:UserList = UserList( PopUpManager.createPopUp(this, UserList, true) ); 
  31.                 userList.x = ( width - userList.width ) / 2; 
  32.                 userList.y = ( height - userList.height ) / 2; 
  33.             } 
  34.              
  35.         ]]>  
  36.     </mx:Script>  
  37.     <mx:Panel width="400" height="300" layout="vertical" paddingLeft="5" paddingRight="5" paddingTop="5">  
  38.         <mx:TextArea id="textArea" width="100%"/>  
  39.         <mx:Button label="选择用户" click="clickHandler()"/>  
  40.     </mx:Panel>  
  41. </mx:Application> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值