zoukankan      html  css  js  c++  java
  • flex自定义用ArrayCollection做数据源的带checkbox的tree(功能强大的完美版^_^)

    自定义组件:
    package com.anydata.consumer.renderers
    {
    	import flash.events.Event;
    	import flash.events.MouseEvent;
    	
    	import mx.collections.ICollectionView;
    	import mx.collections.IList;
    	import mx.collections.IViewCursor;
    	import mx.controls.CheckBox;
    	import mx.controls.Image;
    	import mx.controls.Tree;
    	import mx.controls.treeClasses.ITreeDataDescriptor;
    	import mx.controls.treeClasses.TreeItemRenderer;
    	import mx.controls.treeClasses.TreeListData;
    	/**
    	 * 支持CheckBox的TreeItemRenderer
    	 * @author Montage
    	 */
    	public class TreeCheckBoxRenderer extends TreeItemRenderer
    	{
    		public function TreeCheckBoxRenderer()
    		{
    			super();
    		}
    		protected var myImage:Image;
            private var imageWidth:Number 	= 12;
    	    private var imageHeight:Number 	= 12;
            // set image properties
            private var inner:String 	= "@Embed(source='assets/inner.png')";
    		protected var checkBox:CheckBox;
    		/**
    		 * 表示CheckBox控件从data中所取数据的字段
    		 */
    		private var _selectedField:String="selected";
    
    		/**
    		 * 点击checkbox时,更新dataProvider
    		 * @param event
    		 */
    		protected function changeHandler(event:Event):void
    		{
    			if (data && data[_selectedField] != undefined)
    			{
    				data[_selectedField]=checkBox.selected;
    			}
    
    			var myListData:TreeListData=TreeListData(this.listData);
    			var tree:Tree=Tree(myListData.owner);
    			/* var toggle:Boolean=checkBox.selected; */
    			toggleChildren(data, tree);
    			var parent:Object=tree.getParentItem(data);
    			toggleParents (parent, tree);
    
    		}
    
    		/**
    		 * 初始化控件时, 给checkbox赋值
    		 */
    		override protected function commitProperties():void
    		{
    			super.commitProperties();
    			//trace(data[_selectedField])
    			if (data && data[_selectedField] != undefined)
    			{
    				checkBox.selected=data[_selectedField];
    			}
    			else
    			{
    				checkBox.selected=false;
    			} 
    		}
    
    		/**
    		 * 构建CheckBox
    		 */
    		override protected function createChildren():void
    		{
    			super.createChildren();
    			checkBox=new CheckBox();
    			addChild(checkBox);
    			checkBox.addEventListener(Event.CHANGE, changeHandler);
    			myImage = new Image();
    	    	myImage.source='assets/inner.png';
    			myImage.addEventListener( MouseEvent.CLICK, imageToggleHandler );
    			addChild(myImage);
    		}
    		private function imageToggleHandler(event:Event):void
    		{
    			checkBox.selected = !checkBox.selected;
    			changeHandler(event);
    		}
    
    		/**
    		 * 重置itemRenderer的宽度
    		 */
    		override protected function measure():void
    		{
    			super.measure();
    			measuredWidth+=checkBox.getExplicitOrMeasuredWidth();
    		}
    
    		/**
    		 * 重新排列位置, 将label后移
    		 * @param unscaledWidth
    		 * @param unscaledHeight
    		 */
    		override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
    		{
    			super.updateDisplayList(unscaledWidth, unscaledHeight);
    			if(super.data)
    	        {
    			    if (super.icon != null)
    			    {
    				    checkBox.x = super.icon.x;
    				    checkBox.y = 13;
    				    super.icon.x = checkBox.x + checkBox.width + 25;
    				    super.label.x = super.icon.x + super.icon.width + 3;
    				}
    				else
    			    {
    				    checkBox.x = super.label.x;
    				    checkBox.y = 13;
    				    super.label.x = checkBox.x + checkBox.width + 25;
    				}
    			    if (data[_selectedField] == "11")
    			    {
    			    	myImage.x = checkBox.x+3 ;
    			    	myImage.y = checkBox.y-5 ;
    					myImage.width = imageWidth;
    					myImage.height = imageHeight;
    					checkBox.selected = false;
    			    }
    			    else
    			    {
    			    	myImage.x = 0;
    			    	myImage.y = 0;
    					myImage.width = 0;
    					myImage.height = 0;
    			    }
    			}
    		}
    
    		private function toggleChildren(item:Object, tree:Tree):void
    		{
    			if (item == null)
    			{
    				return;
    			}
    			else
    			{
    				var treeData:ITreeDataDescriptor=tree.dataDescriptor;
    
    				item[_selectedField]=checkBox.selected;
    
    				var tmpTree:IList=tree.dataProvider as IList;
    				tmpTree.itemUpdated(item);
    
    				if (treeData.hasChildren(item))
    				{
    					var children:ICollectionView=treeData.getChildren(item);
    					var cursor:IViewCursor=children.createCursor();
    					while (!cursor.afterLast)
    					{
    						toggleChildren(cursor.current, tree);
    						cursor.moveNext();
    					}
    				}
    			}
    
    		}
    		
    		 private function toggleParents (item:Object, tree:Tree):void{
    		 	if (item == null)
    			{
    				return;
    			}
    			else
    			{
    				var numChecks:int = 0;
    				var numUnChecks:int = 0;
    				var numCats:int = 0;
    				
    				var treeData:ITreeDataDescriptor=tree.dataDescriptor;
    				var children:ICollectionView=treeData.getChildren(item);
    				var cursor:IViewCursor=children.createCursor();
    				
    				while (!cursor.afterLast)
    				{
    					 if(cursor.current[_selectedField]){
    					 	numChecks++;
    					 }else{
    					 	numUnChecks++;
    					 }
    					 cursor.moveNext();
    				}
    				if(numChecks>0&& numUnChecks>0){
    					item[_selectedField] = "11"
    				}else if(numChecks>0){
    					item[_selectedField]=true;
    				}else{
    					item[_selectedField]=false;
    				}
    				var tmpTree:IList=tree.dataProvider as IList;
    				tmpTree.itemUpdated(item);
    				if(tree.getParentItem(item)!=null){
    					toggleParents(tree.getParentItem(item),tree);
    				}
    			}
    		 }
    		
    	}
    }
    
    画面代码:
    [Bindable]
       public var collection:ArrayCollection=new ArrayCollection([{"name": "上海", "selected": false, "children": [{"name": "黄浦", "selected": false}, {"name": "浦东", "selected": true, "children": []}, {"name": "静安", "selected": false}, {"name": "徐汇", "selected": false}]}, {"name": "北京", "selected": false, "children": [{"name": "海淀", "selected": false}, {"name": "朝阳", "selected": true}, {"name": "丰台", "selected": false}]}]);
    <mx:Tree x="29" y="48" width="100%" height="100%" 
          id="groupTree" dataProvider="{collection}" 
          showRoot="true" fontSize="14" fontWeight="bold" 
          doubleClickEnabled="true" paddingLeft="20" 
             itemRenderer="com.anydata.consumer.renderers.TreeCheckBoxRenderer"
             itemOpen="groTree_itemOpeningHandler(event)"
    
             labelField="name" 
             defaultLeafIcon="@Embed(source='assets/ico_phone.gif')" 
             folderClosedIcon="@Embed(source='assets/ico_team.gif')"
             folderOpenIcon="@Embed(source='assets/ico_team.gif')"></mx:Tree>


  • 相关阅读:
    如何在Oracle中复制表结构和表数据
    linux --备份oracle
    Jira-Clone与发邮件的使用
    C# lock关键词/lock语句块、线程锁
    HTML5实现简单圆周运动示例
    C#使用FFmpeg 将视频格式转换成Gif图片示例
    C#使用FFmpeg 将视频格式转换成MP4示例
    ffmpeg ffplay ffprobe资料整理
    Asp.Net MVC是否针对每次请求都重新创建一个控制器实例
    Asp.Net MVC--Controller激活2
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3089563.html
Copyright © 2011-2022 走看看