说多了墨迹,直接帖代码
MyClassFactory 类 如下:
- import flash.display.DisplayObject;
- import mx.core.ClassFactory;
- import mx.states.OverrideBase;
- public class MyClassFactory extends ClassFactory
- {
- public function MyClassFactory(generator:Class=null)
- {
- super(generator);
- }
- private var eventArray:Array=new Array();
- private var _properties:Array=new Array();
- public function addInitEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0,useWeakReference:Boolean=false):void{
- eventArray.push({type:type,listener:listener,useCapture:useCapture,priority:priority,useWeakReference:useWeakReference});
- }
- public function addInitProperties(key:String,value:*):void{
- _properties.push({key:key,value:value});
- }
- override public function newInstance():*{
- trace("MyClassFactory.newInstance();");
- var obj:*=super.newInstance();
- var event:Object;
- if(eventArray!=null&&eventArray.length>0&&obj as DisplayObject){
- var i:int=0;
- for(i=0;i<_properties.length;i++){
- event=_properties[i];
- if(event.value is Function){
- obj[event.key]=event.value();
- }else{
- obj[event.key]=event.value;
- }
- }
- for(i=0;i<eventArray.length;i++){
- event=eventArray[i];
- DisplayObject(obj).addEventListener(event.type,event.listener,event.useCapture,event.priority,event.useWeakReference);
- }
- }
- return obj
- }
- }
MyComboBox 类 如下:
- import flash.events.Event;
- import flash.events.MouseEvent;
- import mx.collections.ArrayCollection;
- import mx.controls.ComboBox;
- import mx.controls.List;
- import mx.controls.listClasses.ListBase;
- import mx.core.ClassFactory;
- import mx.events.FlexEvent;
- import mx.events.FlexMouseEvent;
- import mx.events.ListEvent;
- import mx.events.SandboxMouseEvent;
- public class MyComboBox extends ComboBox
- {
- public function MyComboBox()
- {
- super();
- this.dropdownFactory=new MyClassFactory(List);
- this.getDropdownFactory().addInitEventListener(ListEvent.CHANGE,dropdown_Change,false,1);
- this.getDropdownFactory().addInitEventListener(MouseEvent.MOUSE_DOWN, dropdown_mouseDownHandler);
- this.getDropdownFactory().addInitEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, dropdown_mouseOutsideHandler);
- this.getDropdownFactory().addInitEventListener(FlexMouseEvent.MOUSE_WHEEL_OUTSIDE, dropdown_mouseOutsideHandler);
- this.getDropdownFactory().addInitEventListener(SandboxMouseEvent.MOUSE_DOWN_SOMEWHERE, dropdown_mouseOutsideHandler);
- this.getDropdownFactory().addInitEventListener(SandboxMouseEvent.MOUSE_WHEEL_SOMEWHERE, dropdown_mouseOutsideHandler);
- this.getDropdownFactory().addInitProperties("allowMultipleSelection",true);
- this.getDropdownFactory().addInitProperties("selectedItems",getSelectedItems);
- }
- private var _selectedItems:Array;
- private var _selectedIndices:Array;
- private var _separation:String=",";
- [Bindable("change")]
- [Bindable("valueCommit")]
- public function get selectedItems():Array{
- return _selectedItems==null?[]:_selectedItems;
- }
- public function set selectedItems(array:Array):void{
- var t:String;
- this._selectedItems=array;
- this.text=selectedLabel;
- }
- [Bindable("change")]
- [Bindable("valueCommit")]
- public function get selectedIndices():Array{
- return _selectedIndices!=null?_selectedIndices:[];
- }
- public function set selectedIndices(array:Array):void{
- this._selectedIndices=array;
- }
- /**
- * Label 分隔符
- * */
- public function get separation():String{
- return this._separation;
- }
- public function set separation(value:String):void{
- this._separation=value;
- }
- public function getSelectedItems():Array{
- return this.selectedItems;
- }
- /**
- * 选中项时,Ctrl 是否按下
- * */
- private var ctrlKey:Boolean=false;
- private function dropdown_Change(event:ListEvent):void{
- var listBase:ListBase=event.currentTarget as ListBase;
- this.selectedItems=listBase.selectedItems;
- this.selectedIndices=listBase.selectedIndices;
- trace("dropdown_Change-----"+"selectedItems:"+selectedItems.length+"\t"+"selectedIndices:"+selectedIndices.length);
- }
- private function dropdown_mouseDownHandler(event:MouseEvent):void{
- ctrlKey=event.ctrlKey;
- }
- private function dropdown_mouseDownOutSide(event:FlexMouseEvent):void{
- close();
- }
- override public function close(trigger:Event=null):void{
- if(!ctrlKey){
- super.close(trigger);//未按下 Ctrl 时 关闭
- }
- }
- override public function get selectedLabel():String
- {
- var array:Array=this.selectedItems;
- var result:String="";
- for(var i:int=0;i<array.length;i++){
- result+=itemToLabel(array[i]);
- if(i!=(array.length-1)){
- result+=separation;
- }
- }
- return result;
- }
- public function getDropdownFactory():MyClassFactory{
- return super.dropdownFactory as MyClassFactory;
- }
- /**
- * @private
- */
- private function dropdown_mouseOutsideHandler(event:Event):void
- {
- trace("selectedItems:"+selectedItems.length+"\t"+"selectedIndices:"+selectedIndices.length);
- if (event is MouseEvent)
- {
- var mouseEvent:MouseEvent = MouseEvent(event);
- if (!hitTestPoint(mouseEvent.stageX, mouseEvent.stageY, true))
- {
- super.close(event);
- }
- }
- else if (event is SandboxMouseEvent)
- {
- super.close(event);
- }
- }
- }
调用代码 如下:
- <my:MyComboBox width="180">
- <my:dataProvider>
- <s:ArrayCollection>
- <fx:String>选项一</fx:String>
- <fx:String>选项二</fx:String>
- <fx:String>选项三</fx:String>
- <fx:String>选项四</fx:String>
- <fx:String>选项五</fx:String>
- </s:ArrayCollection>
- </my:dataProvider>
- </my:MyComboBox>
(按Ctrl 点击选择项 为多选)
转载:http://blog.youkuaiyun.com/hellofr/article/details/7026841
本文介绍如何使用自定义类工厂来创建一个具备多选功能的下拉框组件,并通过添加初始化事件监听器和属性来实现组件的自定义行为。实例展示了如何在Flex框架下构建一个灵活的、功能丰富的MyComboBox类。
3676

被折叠的 条评论
为什么被折叠?



