<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-193  評(píng)論-715  文章-1  trackbacks-0
    常常會(huì)用到帶有3種狀態(tài)CheckBox的樹形組件,比如在權(quán)限管理中,或者是地區(qū)選擇中等等,如下圖:


    不多說費(fèi)話了,直接進(jìn)入主題,看看如何實(shí)現(xiàn)。其實(shí)在Flex中,只用自己實(shí)現(xiàn)一個(gè)TreeItemRenderer就可以了,代碼如下:
    package com.robin {
        import flash.events.Event;
        import flash.geom.Rectangle;
        
        import mx.controls.CheckBox;
        import mx.controls.treeClasses.TreeItemRenderer;
        import mx.controls.treeClasses.TreeListData;
        import mx.events.FlexEvent;

        public class ThreeStatusCheckBoxTreeItemRenderer extends TreeItemRenderer 
    {
            private static 
    var _colorForThirdState:int = 0x37BEF8;
            private static 
    var _selectedField:String = "selected";
            
            private 
    var checkBox:CheckBox;

            public 
    function ThreeStatusCheckBoxTreeItemRenderer() {
                super();
            }


            override protected 
    function createChildren():void {
                super.createChildren();
                checkBox 
    = new CheckBox();
                addChild(checkBox);
                checkBox.addEventListener(Event.CHANGE, changeHandler);
            }


            
    /**
             * Initial data when component initialization
             *
             
    */

            override protected 
    function commitProperties():void {
                super.commitProperties();
                
    if (data && data.@[_selectedField] != null{
                    
    var s:int = int(data.@[_selectedField]);
                    
    var selected:Boolean = s > 0 ? true : false;
                    checkBox.selected 
    = selected;
                }
     else {
                    checkBox.selected 
    = false;
                }

            }


            
    /**
             * update dataProvider when user click CheckBox
             *
             
    */

            protected 
    function changeHandler(event:Event):void {
                
    if (data && data.@[_selectedField] != null{
                    data.@[_selectedField] 
    = checkBox.selected ? "1" : "0";
                }

                
                
    var listData:TreeListData = TreeListData(listData);
                
    if (listData.hasChildren) {
                    
    var item:XML = XML(listData.item);
                    handleAllChildren(item.children());
                }

                handleAllParents(listData.item.parent());
            }


            private 
    function handleAllChildren(children:XMLList):void {
                
    for each (var item:XML in children) {
                    item.@[_selectedField] 
    = checkBox.selected ? "1" : "0";
                    
    var children:XMLList = item.children();
                    
    if (children.length() > 0{
                        handleAllChildren(children);
                    }

                }

            }


            private 
    function handleAllParents(parent:XML):void {
                
    if (parent != null{
                    
    var children:XMLList = parent.children();
                    
    var hasSelected1:Boolean = false;
                    
    var hasSelected2:Boolean = false;
                    
    var hasSelected0:Boolean = false;
                    
    for each (var item:XML in children) {
                        
    if (int(item.@[_selectedField]) == 1{
                            hasSelected1 
    = true;
                        }

                        
    if (int(item.@[_selectedField]) == 2{
                            hasSelected2 
    = true;
                        }

                        
    if (int(item.@[_selectedField]) == 0{
                            hasSelected0 
    = true;
                        }

                    }

                    
    if (checkBox.selected == true{
                        
    if (!hasSelected0 && !hasSelected2) {
                            parent.@[_selectedField] 
    = "1";
                        }
     else {
                            parent.@[_selectedField] 
    = "2";
                        }

                    }
     else {
                        
    if (!hasSelected1 && !hasSelected2) {
                            parent.@[_selectedField] 
    = "0";
                        }
     else {
                            parent.@[_selectedField] 
    = "2";
                        }

                    }

                    handleAllParents(parent.parent());
                }

            }


            
    /**
             * reset itemRenderer's width
             
    */

            override protected 
    function measure():void {
                super.measure();
                measuredWidth 
    += checkBox.getExplicitOrMeasuredWidth();
            }


            
    /**
             * re-assign layout for tree, move lable to right
             * @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();

                
    var node:XML = data as XML;
                
    if (int(node.@[_selectedField]) == 2{
                    fillCheckBox(
    true);
                }
     else {
                    fillCheckBox(
    false);
                }


            }

            
            
    /**
             * re-draw check box for the third state
             * @param isFill
             
    */

            private 
    function fillCheckBox(isFill:Boolean):void {
                checkBox.validateNow();
                checkBox.graphics.clear();
                
    if (isFill) {
                    
    var myRect:Rectangle = checkBox.getBounds(checkBox);
                    checkBox.graphics.beginFill(_colorForThirdState, 
    1);
                    checkBox.graphics.drawRoundRect(myRect.x, myRect.y, myRect.width, myRect.height, 
    10x00FF00);
                    checkBox.graphics.endFill();
                }

            }



        }

    }

    然后在tree組件中使用這個(gè)renderer就可以了。
    <?xml version="1.0" encoding="utf-8"?>
    <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
                   xmlns:s
    ="library://ns.adobe.com/flex/spark" 
                   xmlns:mx
    ="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" xmlns:robin="com.robin.*">
        
    <fx:Declarations>
            
    <fx:XMLList id="treeData">
                
    <node name = "ShangHai" type="ROOT" selected ="1">
                    
    <node name = "HuangPu" type="NODE" selected = "1">
                        
    <node name = "A" type="NODE" selected = "1" />
                        
    <node name = "B" type="NODE" selected = "1" />
                    
    </node>
                    
    <node name = "PuDong" type="NODE" selected = "1"/>
                
    </node>
                
    <node name = "Beijing" type="ROOT" selected = "2">
                    
    <node name = "HaiDian" type="NODE" selected = "0"/>
                    
    <node name = "ChaoYang" type="NODE" selected = "1"/>
                
    </node>
            
    </fx:XMLList>
        
    </fx:Declarations>
        
    <fx:Script>
            
    <![CDATA[
                protected 
    function getCurrentData_clickHandler(event:MouseEvent):void {
                    currentText.text 
    = String(treeData);
                }

            ]]
    >
        
    </fx:Script>
        
        
    <mx:Tree x = "0" y = "0" width = "232" height = "285" itemRenderer = "com.robin.ThreeStatusCheckBoxTreeItemRenderer" labelField = "@name" dataProvider = "{treeData}"/>
        
    <s:Button x = "43" y = "293" label = "Get Current Data" id = "getCurrentData" click = "getCurrentData_clickHandler(event)"/>
        
    <s:TextArea x = "253" y = "0" width = "459" height = "285" id = "currentText"/>
    </s:Application>

    就是這么簡單!
    posted on 2010-09-15 07:58 Robin's Programming World 閱讀(5943) 評(píng)論(7)  編輯  收藏 所屬分類: Flex & Flash

    評(píng)論:
    # re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn) 2011-09-21 11:21 | 729106109
    那后臺(tái)用java怎么組成所需要的tree呢?謝謝了  回復(fù)  更多評(píng)論
      
    # re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn) 2011-10-09 12:27 | Robin's Java World
    后臺(tái)什么數(shù)據(jù)結(jié)構(gòu)都無所謂,到前臺(tái)變成XML就可以了。  回復(fù)  更多評(píng)論
      
    # re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn)[未登錄] 2011-12-09 09:22 | neil
    # re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn) 2012-01-05 14:16 | 歐巴
    在Java后臺(tái)拼成XML格式的字符串就可以了  回復(fù)  更多評(píng)論
      
    # re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn) 2013-04-27 17:21 | k-mart
    三個(gè)狀態(tài),很科學(xué),贊一個(gè)  回復(fù)  更多評(píng)論
      
    # re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn) 2015-07-21 10:23 | 鐘凡
    怎么去掉前面的小圖標(biāo)  回復(fù)  更多評(píng)論
      
    # re: Flex中帶有三種狀態(tài)CheckBox的Tree的實(shí)現(xiàn) 2016-01-04 17:39 | bns
    帶有3種狀態(tài)CheckBox的樹形組件剛好用到
    收了  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 狠狠热精品免费观看| 久久久久亚洲AV无码网站| eeuss影院免费92242部| 亚洲精品无码专区| 91精品免费观看| 爱情岛亚洲论坛在线观看| 亚洲乱色熟女一区二区三区丝袜| 亚洲国产一区在线| 成人a毛片视频免费看| 97久久精品亚洲中文字幕无码| 在线免费视频一区二区| a级片在线免费看| 亚洲天然素人无码专区| 性色av极品无码专区亚洲| 亚洲自偷自偷偷色无码中文| 国产成人无码免费看视频软件| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国内自产拍自a免费毛片| 国产黄片不卡免费| 亚洲精品人成网在线播放影院| 亚洲国产成人乱码精品女人久久久不卡| 亚洲久悠悠色悠在线播放| 亚洲午夜AV无码专区在线播放 | 在线观看黄片免费入口不卡| 成年女人永久免费观看片| 亚洲国产精品ⅴa在线观看| 亚洲乱码中文字幕久久孕妇黑人| 99精品全国免费观看视频| 亚洲人成图片网站| 又粗又大又长又爽免费视频 | 三上悠亚电影全集免费| 亚洲欧洲AV无码专区| 久久久婷婷五月亚洲97号色| 亚洲国产午夜中文字幕精品黄网站| 1000部无遮挡拍拍拍免费视频观看| 亚洲免费精彩视频在线观看| 四虎影视在线永久免费看黄| 午夜性色一区二区三区免费不卡视频| 亚洲六月丁香六月婷婷蜜芽| 免费观看的毛片大全| 免费在线看黄网站|