flex自訂用ArrayCollection做資料來源的帶checkbox的tree(功能強大的完美版^_^)

來源:互聯網
上載者:User
自訂群組件:
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>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.