[Flex] 组件Tree系列 —— 支持CheckBox组件

主程序mxml:

  1 <?xml version="1.0" encoding="utf-8"?>

  2 

  3 <!--功能描述:支持CheckBox-->

  4 

  5 <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 

  6                xmlns:s="library://ns.adobe.com/flex/spark" 

  7                xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">

  8     <fx:Declarations>

  9         

 10         

 11     </fx:Declarations>

 12     <fx:Style>

 13         @namespace s "library://ns.adobe.com/flex/spark";

 14         @namespace mx "library://ns.adobe.com/flex/mx";

 15         mx|Tree{

 16             /*去掉默认文件夹图标*/

 17             folderClosedIcon: ClassReference(null);

 18             folderOpenIcon: ClassReference(null);

 19             

 20             /*去掉叶子节点图标*/

 21             defaultLeafIcon: ClassReference(null);

 22             

 23             /*

 24             defaultLeafIcon    指定叶图标

 25             disclosureClosedIcon    指定的图标旁边显示一个封闭的分支节点。默认的图标是一个黑色三角形。

 26             disclosureOpenIcon    指定的图标旁边显示一个开放的分支节点。默认的图标是一个黑色三角形。

 27             folderClosedIcon    关闭指定的文件夹图标的一个分支节点。

 28             folderOpenIcon    指定打开的文件夹图标的一个分支节点。

 29             例:三角图标修改如下代码使用即可换成自己的了:

 30             disclosureOpenIcon:Embed(source='images/a.png');

 31             disclosureClosedIcon:Embed(source='images/b.png');

 32             */

 33         }

 34         

 35     </fx:Style>

 36     

 37     <fx:Script>

 38         <![CDATA[

 39             import com.render.TreeRightClickManager;

 40             

 41             import mx.controls.Alert;

 42             private var rightClickRegisted:Boolean;

 43                 

 44             [Bindable]

 45             private var data:XML=

 46                 <data>

 47                     <actor label="周星驰" level="0" selected="false">

 48                         <year label="1988" level="1" selected="false">

 49                             <item label="《霹雳先锋》香港票房8916612 " level="2" selected="false"/>

 50                             <item label="《捕风汉子》香港票房3149395 " level="2" selected="false"/>

 51                             <item label="《最佳女婿》香港票房5807710 " level="2" selected="false"/>

 52                         </year>

 53                         <year label="1989" level="1" selected="false">

 54                             <item label="《龙在天涯》香港票房6809853 " level="2" selected="false"/>

 55                             <item label="《义胆群英》香港票房7913329 " level="2" selected="false"/>

 56                             <item label="《流氓差婆》香港票房5624622 " level="2" selected="false"/>

 57                             <item label="《风雨同路》香港票房9335299 " level="2" selected="false"/>

 58                         </year>

 59                         <year label="1990" level="1" selected="false">

 60                             <item label="《望夫成龙》香港票房13703364 " level="2" selected="false"/>

 61                             <item label="《咖喱辣椒》香港票房15777856 " level="2" selected="false"/>

 62                             <item label="《小偷阿星》香港票房7968106 " level="2" selected="false"/>

 63                             <item label="《师兄撞鬼》香港票房12128944 " level="2" selected="false"/>

 64                             <item label="《赌圣》香港票房41326156 "  level="2" selected="false"/>

 65                             <item label="《无敌幸运星》香港票房18799869" level="2" selected="false"/>

 66                             <item label="《江湖最后一个大佬》香港票房5495811 " level="2" selected="false"/>

 67                         </year>

 68                     </actor>

 69                         

 70                     <actor label="李连杰" level="0" selected="false">

 71                         <year label="1992" level="1" selected="false">

 72                             <item label="笑傲江湖之东方不败(1992)" level="2" selected="false"/>

 73                             <item label="黄飞鸿之二男儿当自强(1992) " level="2" selected="false"/>

 74                             <item label="黄飞鸿之三狮王争霸(1992) " level="2" selected="false"/>

 75                         </year>

 76                         <year label="1993" level="1" selected="false">

 77                             <item label="方世玉Ⅱ万夫莫敌(1993) " level="2" selected="false"/>

 78                             <item label="倚天屠龙记之魔教教主(1993)" level="2" selected="false"/>

 79                             <item label="黄飞鸿之铁鸡斗蜈蚣(1993)" level="2" selected="false"/>

 80                             <item label="太极张三丰(1993)" level="2" selected="false"/>

 81                         </year>

 82                         <year label="1994" level="1" selected="false">

 83                             <item label="新少林五祖(1994)" level="2" selected="false"/>

 84                             <item label="精武英雄(1994)" level="2" selected="false"/>

 85                             <item label="中南海保镖(1994)" level="2" selected="false"/>

 86                             <item label="给爸爸的信(1995)" level="2" selected="false"/>

 87                         </year>

 88                             <year label="1995" level="1" selected="false">

 89                             <item label="鼠胆龙威(1995)" level="2" selected="false"/>

 90                             <item label="给爸爸的信(1995)" level="2" selected="false"/>

 91                         </year>

 92                     </actor>

 93                 </data>

 94                 ;

 95             private function treeChangeHandle(event:Event):void{

 96                 var selectedTreeNode:XML;

 97                 selectedTreeNode=Tree(event.target).selectedItem as XML;

 98             }

 99                         

100             private function getSelectedChild(xml:XML):String{

101                 var result:String="";

102                 for(var i:int=0;i<xml.children().length();i++){

103                     if((xml.children()[i].@selected=="true") && (xml.children()[i].@level=="2")){

104                         result+=xml.children()[i].@label+"\n";

105                     }

106                     var temp:XML=new XML(xml.children()[i].toString());

107                     if(temp.children().length()>0){

108                         result+=getSelectedChild(temp);

109                     }

110                 }

111                 return result;

112             }

113             

114             protected function add_clickHandler(event:MouseEvent):void

115             {

116                 txtAr.text=getSelectedChild(data);

117             }

118             

119         ]]>

120     </fx:Script>

121     

122     <s:Panel width="300" height="400" title="所有影片">

123         <mx:Tree id="tree" top="0" left="0" width="100%" height="100%" labelField="@label" showRoot="false"

124                  itemRenderer="com.render.TreeCheckBoxRenderer" dataProvider="{data}" 

125                  change="treeChangeHandle(event)" styleName="Tree">

126         </mx:Tree>

127     </s:Panel>

128     <s:Panel x="310" width="300" height="400" title="选中的影片">

129         <s:TextArea id="txtAr" top="0" left="0" width="100%" height="100%"/>

130     </s:Panel>

131     <s:Button y="410" label="添加选中" click="add_clickHandler(event)"/>

132 </s:Application>

 

com.render.TreeCheckBoxRenderer类:

package com.render

{

    import flash.events.Event;

    import flash.events.MouseEvent;

    

    import mx.controls.Alert;

    import mx.controls.CheckBox;

    import mx.controls.Tree;

    import mx.controls.treeClasses.TreeItemRenderer;

    import mx.controls.treeClasses.TreeListData;

    

    import spark.components.Button;

    

    /**

     * 支持CheckBox的TreeItemRenderer 

     * @author 

     * 

     */       

    public class TreeCheckBoxRenderer extends TreeItemRenderer

    {

        public function TreeCheckBoxRenderer()

        {

            super();

        }

        

        /**

         * 表示CheckBox控件从data中所取数据的字段

         */        

        

        protected var checkBox:CheckBox;

        protected var button:Button;

        

        /**

         * 构建CheckBox

         */        

        override protected function createChildren():void

        {

            super.createChildren();

            checkBox = new CheckBox();

            addChild( checkBox );

            checkBox.addEventListener(Event.CHANGE, changeHandler);

        }

        

        /**

         * 点击checkbox时,更新dataProvider

         * @param event

         */        

        protected function changeHandler( event:Event ):void

        {

            if( data.@selected!="" ){

                data.@selected= checkBox.selected.toString();

                for (var i:int=0;i<data.children().length();i++){

                    data.children()[i].@selected=checkBox.selected.toString();;

                }     

            }    

        } 

        

        

        /**

         * 初始化控件时, 给checkbox赋值

         */        

        override protected function commitProperties():void

        {

            super.commitProperties();

            if(data.@selected!="" ){

                //trace(data,"data");

                if(data.@selected=="true"){

                    checkBox.selected=true;

                }else{

                    checkBox.selected=false;

                }

            }

            else{

                checkBox.selected = false;

            }

        }

        

        /**

         * 重置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);

            var startx:Number = data ? TreeListData( listData ).indent : 0;

            if (disclosureIcon){

                disclosureIcon.x = startx;

                startx = disclosureIcon.x + disclosureIcon.width;

                disclosureIcon.setActualSize(disclosureIcon.width,disclosureIcon.height);

                disclosureIcon.visible = data ?TreeListData( listData ).hasChildren :false;

            }

            

            if (icon){

                icon.x = startx;

                startx = icon.x + icon.measuredWidth;

                icon.setActualSize(icon.measuredWidth, icon.measuredHeight);

            }

            checkBox.move(startx, ( unscaledHeight - checkBox.height ) / 2 );

            label.x = startx + checkBox.getExplicitOrMeasuredWidth();

        }

    }

}

 

你可能感兴趣的:(checkbox)