Flex自定义组件与自定义事件

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/dengxingbo/archive/2009/12/14/5005154.aspx

 

1、自定义组件

2、自定义事件

3、结合使用

一、自定义组件(使用的是Flex组件,ActionScript组件相对麻烦点,可视化差点)

该组件由一个TextArea和两个Button组成,如图:

 

代码:

MyComponent.mxml

view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8"?> 
02.<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="180" height="94" creationComplete="initComponent()"> 
03.    <mx:Metadata> 
04.        /**  
05.         * 1. 编译期间执行  
06.         * 2. 自定义组件一般可以通过dispatchEvent委派parent来处理某个事件,这就需要在parent中设置一个addEventLister来监听事件。  
07.         * 就像Button的Event.CLICK事件,除了可以通过addEventLister(Event.CLICK, clickHandle)来监听处理外,在Flex组件中还可以  
08.         * 直接 mx:Button click="clickHandle(event)" / 。怎么定义自定义组件也可以达到如此效果呢?  
09.         *  2.1) 内部声明:[Event(name="commit",type ="laxino.MyEvent")],type是指事件的类型(如1的类型是int,'aaa'的类型是String),name是指  
10.         * Event中的构造函数中type。  
11.         *  2.2) 外部使用:commit="commitHandle(myEvent)"是指为该组件注册了一个监听器,监听名字叫commit的事件,并通过commitHandle处理。事件的触发和  
12.         * 委派必须在组件内实现。  
13.         *   
14.         */  
15.           
16.         /**  
17.         *   
18.         * Using the Event metadata tag   
19.         * You use the [Event] metadata tag to define events dispatched by a component so that the Flex compiler can recognize   
20.         * them as MXML tag attributes in an MXML file. You add the [Event] metadata tag in one of the following locations:   
21.         * ActionScript components   Above the class definition, but within the package definition, so that the events are bound   
22.         * to the class and not a particular member of the class.   
23.         * MXML components   In the  mx:Metadata  tag of an MXML file.  
24.         *   
25.         */  
26.           
27.        [Event(name="commit",type ="laxino.MyEvent")]  
28.        [Event(name="preview",type ="laxino.MyEvent")]  
29.    </mx:Metadata> 
30.    <mx:Script> 
31.        <!--[CDATA[    
32.            private function initComponent():void  
33.            {  
34.                  
35.            }  
36.              
37.            private function preview(event:Event):void  
38.            {  
39.                this.dispatchEvent(new MyEvent(MyEvent.PREVIEW, content.text));  
40.            }  
41.              
42.            private function commitHandle(event:Event):void  
43.            {  
44.                this.dispatchEvent(new MyEvent(MyEvent.COMMIT, content.text));  
45.            }  
46.              
47.        ]]--> 
48.    </mx:Script> 
49.    <mx:TextArea x="10" y="10" id="content"/> 
50.    <mx:Button x="10" y="62" label="Preview" width="82" click="preview(event)"/> 
51.    <mx:Button x="100" y="62" label="Commit" click="commitHandle(event)" /> 
52.</mx:Canvas> 
<?xml version="1.0" encoding="utf-8"?>
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="180" height="94" creationComplete="initComponent()">
 <mx:Metadata>
  /**
   * 1. 编译期间执行
   * 2. 自定义组件一般可以通过dispatchEvent委派parent来处理某个事件,这就需要在parent中设置一个addEventLister来监听事件。
   * 就像Button的Event.CLICK事件,除了可以通过addEventLister(Event.CLICK, clickHandle)来监听处理外,在Flex组件中还可以
   * 直接 mx:Button click="clickHandle(event)" / 。怎么定义自定义组件也可以达到如此效果呢?
   *  2.1) 内部声明:[Event(name="commit",type ="laxino.MyEvent")],type是指事件的类型(如1的类型是int,'aaa'的类型是String),name是指
   * Event中的构造函数中type。
   *  2.2) 外部使用:commit="commitHandle(myEvent)"是指为该组件注册了一个监听器,监听名字叫commit的事件,并通过commitHandle处理。事件的触发和
   * 委派必须在组件内实现。
   *
   */
  
   /**
   *
   * Using the Event metadata tag
   * You use the [Event] metadata tag to define events dispatched by a component so that the Flex compiler can recognize
   * them as MXML tag attributes in an MXML file. You add the [Event] metadata tag in one of the following locations:
   * ActionScript components   Above the class definition, but within the package definition, so that the events are bound
   * to the class and not a particular member of the class.
   * MXML components   In the  mx:Metadata  tag of an MXML file.
   *
   */
  
        [Event(name="commit",type ="laxino.MyEvent")]
        [Event(name="preview",type ="laxino.MyEvent")]
 </mx:Metadata>
 <mx:Script>
  <!--[CDATA[ 
   private function initComponent():void
   {
    
   }
   
   private function preview(event:Event):void
   {
    this.dispatchEvent(new MyEvent(MyEvent.PREVIEW, content.text));
   }
   
   private function commitHandle(event:Event):void
   {
    this.dispatchEvent(new MyEvent(MyEvent.COMMIT, content.text));
   }
   
  ]]-->
 </mx:Script>
 <mx:TextArea x="10" y="10" id="content"/>
 <mx:Button x="10" y="62" label="Preview" width="82" click="preview(event)"/>
 <mx:Button x="100" y="62" label="Commit" click="commitHandle(event)" />
</mx:Canvas>
 

二、自定义事件

当按Button1时触发preview事件,点击Button2时触发commit事件,传输数据通过$data变量存储。

代码:

view plaincopy to clipboardprint?
01.package laxino  
02.{  
03.    import flash.events.Event;  
04. 
05.    public class MyEvent extends Event  
06.    {  
07.        public static const COMMIT:String = "commit";  
08.        public static const PREVIEW:String = "preview";  
09.          
10.        private var $data:Object;  
11.          
12.        public function MyEvent(type:String, $data:Object=null, bubbles:Boolean=true, cancelable:Boolean=false)  
13.        {  
14.            super(type, bubbles, cancelable);  
15.            this.$data = $data;  
16.        }  
17.          
18.        public function get data():Object  
19.        {  
20.            return $data;  
21.        }  
22.          
23.        public function set data($data:Object):void 
24.        {  
25.            this.$data = $data;  
26.        }  
27.    }  
28.} 
package laxino
{
 import flash.events.Event;

 public class MyEvent extends Event
 {
  public static const COMMIT:String = "commit";
  public static const PREVIEW:String = "preview";
  
  private var $data:Object;
  
  public function MyEvent(type:String, $data:Object=null, bubbles:Boolean=true, cancelable:Boolean=false)
  {
   super(type, bubbles, cancelable);
   this.$data = $data;
  }
  
  public function get data():Object
  {
   return $data;
  }
  
  public function set data($data:Object):void
  {
   this.$data = $data;
  }
 }
}

三、使用。

view plaincopy to clipboardprint?
01.<?xml version="1.0" encoding="utf-8"?> 
02.<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:cus="laxino.*" applicationComplete="initApp()"> 
03.    <mx:Script> 
04.        <!--[CDATA[  
05.            import mx.controls.Alert;  
06.            import laxino.MyEvent;  
07.              
08.            private function initApp():void  
09.            {  
10.                // 方式一,监听preview事件  
11.                myComponent.addEventListener(MyEvent.PREVIEW, previewHandle);  
12.            }  
13.              
14.            private function commitHandle(event:MyEvent):void  
15.            {  
16.                result.text = event.data.toString();  
17.            }  
18.              
19.            private function previewHandle(event:MyEvent):void  
20.            {  
21.                Alert.show(event.data.toString(), "Preview");  
22.            }  
23.        ]]--> 
24.    </mx:Script> 
25.    <mx:Label x="10" y="11" text="Custom Component"/> 
26.    <!-- 方式二,监听commit事件 --> 
27.    <cus:MyComponent id="myComponent" x="10" y="37" commit="commitHandle(event)" ></cus:MyComponent> 
28.    <mx:Label x="10" y="139" text="Standard Component(Text)"/> 
29.    <mx:Text id="result" x="10" y="165" text="Empty" width="180" height="123" />    
30.</mx:Application> 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:cus="laxino.*" applicationComplete="initApp()">
 <mx:Script>
  <!--[CDATA[
   import mx.controls.Alert;
   import laxino.MyEvent;
   
   private function initApp():void
   {
    // 方式一,监听preview事件
    myComponent.addEventListener(MyEvent.PREVIEW, previewHandle);
   }
   
   private function commitHandle(event:MyEvent):void
   {
    result.text = event.data.toString();
   }
   
   private function previewHandle(event:MyEvent):void
   {
    Alert.show(event.data.toString(), "Preview");
   }
  ]]-->
 </mx:Script>
 <mx:Label x="10" y="11" text="Custom Component"/>
 <!-- 方式二,监听commit事件 -->
 <cus:MyComponent id="myComponent" x="10" y="37" commit="commitHandle(event)" ></cus:MyComponent>
 <mx:Label x="10" y="139" text="Standard Component(Text)"/>
 <mx:Text id="result" x="10" y="165" text="Empty" width="180" height="123" /> 
</mx:Application>
 

有时候我们还需要加上一个自定义的EventDispatcher,通过继承EventDispatcher或实现IEventDispatcher接口。

最终结果,如图:

 

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/dengxingbo/archive/2009/12/14/5005154.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值