代码之家  ›  专栏  ›  技术社区  ›  Alexander Farber

带tillelist和自定义渲染器的弹出按钮

  •  0
  • Alexander Farber  · 技术社区  · 15 年前

    我为一个弹出按钮准备了一个简单的测试用例,它打开了一个包含黑色和红色条目的tilleist,并且大部分都可以工作,但是有两个烦恼。

    我搜索了很多,尝试了几个变体(在渲染器中添加了[可绑定]成员;在bids数组中添加了颜色成员;创建了 公共重写集数据() 方法;…)也得到了一些答案,但它们太笼统了。

    如果有人能建议代码来解决我代码中的两个问题,我将不胜感激:

    1)向左滚动“tl2”不太好:条目以红色和黑色混合显示。我知道tilleist会重用itemrenderer,但是如何解决这个问题?

    2)在调试模式下,我收到许多警告: 警告:无法绑定到类“object”上的属性“label”(类不是IEventDispatcher)

    谢谢您, 亚历克斯

    迈伦德尔.mxml:

        <?xml version="1.0" encoding="utf-8"?>
    <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
               verticalScrollPolicy="off" horizontalScrollPolicy="off"
               width="100%" height="100%">
        <mx:Script>
            <![CDATA[
                public static function findColor(str:String):uint {
                    return (str.indexOf('♥') != -1 ||
                        str.indexOf('♦') != -1) ? 0xFF0000 : 0x000000;
                }
            ]]>
        </mx:Script>
    
        <mx:Label truncateToFit="true" width="60"
                  text="{data.label}" color="{findColor(data.label)}"/>
    </mx:Canvas>
    

    MyTest.mxml:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                    creationPolicy="all" applicationComplete="init(event);">
        <mx:Style>
            @font-face {
                src:url("C:\\WINDOWS\\Fonts\\arial.ttf");
                fontFamily: myFont;
                unicodeRange:
                    U+0020-U+0040, /* Punctuation, Numbers */
                    U+0041-U+005A, /* Upper-Case A-Z */
                    U+005B-U+0060, /* Punctuation and Symbols */
                    U+0061-U+007A, /* Lower-Case a-z */
                    U+007B-U+007E, /* Punctuation and Symbols */
                    U+0410-U+0451, /* cyrillic */
                    U+2660-U+266B; /* card suits */
            }
            List, CheckBox, Label, Button, PopUpButton, TileList {
                fontFamily: myFont;
                fontSize: 24;
            }
        </mx:Style>
    
        <mx:Script>
            <![CDATA[
                import mx.controls.*;
                import mx.events.*;
    
                [Bindable]
                private var bids:Array;
                private var tl:TileList;
    
                private function init(event:FlexEvent):void {
                    bids = createBids();
                    pub.popUp = createList(bids);
                }
    
                private function createBids():Array {
                    var arr:Array = [{label: 'Pass'}];
                    for (var i:uint = 6; i <= 10; i++)
                        for (var j:uint = 0; j < 5; j++)
                            arr.unshift({label: i+'♠♣♦♥ '.charAt(j%5)});
    
                    return arr;
                }
    
                private function createList(arr:Array):TileList {
                    tl = new TileList();
                    tl.maxColumns = 5;
                    tl.width = 350;
                    tl.height = 250;
                    tl.dataProvider = arr;
                    tl.itemRenderer = new ClassFactory(MyRenderer);
                    tl.addEventListener('itemClick', itemClickHandler);
    
                    if (arr.length > 0) {
                        tl.selectedIndex = arr.length - 1;
                        pub.label = arr[tl.selectedIndex].label;
                    }
    
                    return tl;
                }
    
                private function itemClickHandler(event:ListEvent):void {
                    var index:uint = tl.columnCount * event.rowIndex + event.columnIndex;
                    var label:String = bids[index].label;
                    pub.label = label;
                    pub.setStyle('color', MyRenderer.findColor(label));
                    pub.close();
                    tl.selectedIndex = index;
                }
            ]]>
        </mx:Script>
    
        <mx:Panel title="TileList scrolling problem" height="100%" width="100%"
                  paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">
    
            <mx:Label width="100%" color="blue" text="Select your bid:"/>
    
            <mx:TileList id="tl2" height="200" width="200"
                         maxColumns="5" rowHeight="30" columnWidth="60"
                         dataProvider="{bids}" itemRenderer="MyRenderer"/>
        </mx:Panel>
    
        <mx:ApplicationControlBar width="100%">
            <mx:Spacer width="100%"/>
            <mx:CheckBox id="auto" label="Auto:"/>
            <mx:Button id="left" label="&lt;&lt;"/>
            <mx:PopUpButton id="pub" width="90"/>
            <mx:Button id="right" label="&gt;&gt;"/>
        </mx:ApplicationControlBar>
    </mx:Application>
    

    更新:

    谢谢你,韦德,警告已经消失了 {数据、标签} 但“tl2”仍有滚动问题。

    新的myrenderer.mxml(仍有滚动问题):

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
               verticalScrollPolicy="off" horizontalScrollPolicy="off"
               width="100%" height="100%">
        <mx:Script>
            <![CDATA[
    
                override public function set data(value:Object):void {
                    super.data = value;
    
                    var str:String = String(value.label);
                    myLabel.text = str;
                    myLabel.setStyle('color', findColor(str));
                }
    
                public static function findColor(str:String):uint {
                    return (str.indexOf('♥') != -1 ||
                        str.indexOf('♦') != -1) ? 0xFF0000 : 0x000000;
                }
            ]]>
        </mx:Script>
    
        <mx:Label id="myLabel" truncateToFit="true" width="60"/>
    </mx:Canvas>
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   Wade Mueller    15 年前

    您可以通过覆盖项呈现器上的set data方法来解决这两个问题:

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml"
               verticalScrollPolicy="off" horizontalScrollPolicy="off"
               width="100%" height="100%">
        <mx:Script>
            <![CDATA[
                override public function set data(value:Object):void {
                    super.data = value;
                    var str:String = value.label;
                    this.myLabel.text = str;
                    this.myLabel.setStyle("color", (str.indexOf('♥') != -1 ||
                        str.indexOf('♦') != -1) ? 0xFF0000 : 0x000000);
                }
            ]]>
        </mx:Script>
    
        <mx:Label id="myLabel" truncateToFit="true" width="60"/>
    </mx:Canvas>
    

    由于渲染器被重新使用,确保它们被正确更新的最佳方法是使用set data方法,因为当渲染器被重新使用时,它总是被调用。这还可以消除绑定警告,因为您不再绑定到data.label。注意:我还没有测试过这段代码,它可能需要一些调整:)希望能有所帮助。

    编辑:您的“tl2”问题看起来是由水平滚动平铺列表引起的,而tillelist似乎是为垂直滚动而优化的。由于您的数据集是有限的,而且相对较小,所以我将使tile列表的大小达到最大,以显示所有元素(消除了项目渲染器的重复使用),并将其包装在画布集中,以达到所需的尺寸,并让画布处理滚动。可能不是你要找的答案,对不起。

    推荐文章