当使用TileList作为参数调用addChild时,ActionScript抛出错误#1009

时间:2011-03-23 14:21:57

标签: actionscript-3 flash-cs4

确切地说这是错误。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at fl.containers::BaseScrollPane/drawBackground()
    at fl.controls::TileList/draw()
    at fl.core::UIComponent/callLaterDispatcher()

现在我已经尝试了这个页面中的几个Adobe自己的例子,http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/fl/controls/TileList.html,它们都会抛出这个错误。

错误由TileList实例触发,该实例是addChild函数的参数。

这是我的包,当我更改displayComponent是List时,它可以正常工作。

package com.pennstate {
    import fl.data.DataProvider;
    import flash.display.MovieClip;
    import flash.display.DisplayObjectContainer;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.text.TextFormat;
    import flash.xml.XMLDocument;
    import com.adobe.serialization.json.JSON;
    import fl.controls.List;
    import fl.controls.TileList; 

    public class Sign {
        public var displayComponent:TileList;
        public var url:String;
        public var provider:DataProvider;
        public var mc:MovieClip;
        public var container:DisplayObjectContainer;

        public function Sign( url:String, container ) {
            this.container = container;
            this.displayComponent = new TileList();
            this.mc = new MovieClip();
            this.url = url;
            this.provider = new DataProvider();

            _componentSetup();
            loadJson();
            _componentFormat();
        }

        private function _componentSetup() {
            displayComponent.labelFunction = getLabelFieldContent;
            displayComponent.sourceFunction = getSourceFieldContent;
            displayComponent.dataProvider = provider;
            displayComponent.selectable = false;
            displayComponent.setStyle("contentPadding", 5);
            displayComponent.setSize(1720,770);
            displayComponent.move(100,200);
            displayComponent.rowHeight = 190;
            trace('End setup');
        }

        private function _componentFormat() {
            var listTextFormat:TextFormat = new TextFormat();
            listTextFormat.font = "Arial";
            listTextFormat.color = 0x000000;
            listTextFormat.bold = true;
            listTextFormat.size = 48;
            displayComponent.setRendererStyle("textFormat", listTextFormat);
            trace('End formatting');
        }

        function loadJson():void {
            var jsonLoader:URLLoader = new URLLoader();
            jsonLoader.addEventListener(Event.COMPLETE, onJsonComplete);
            jsonLoader.load( new URLRequest( url ) );
        }  

        function onJsonComplete(e:Event):void {
            trace('Loading finished.');
            var jsonData:String = e.target.data;
            trace(jsonData + "\n");
            var decodedData = JSON.decode(jsonData, false);
            for (var index in decodedData.rows) {
                provider.addItem({title: decodedData.rows[index].node.title, result: decodedData.rows[index].node.Result});
                trace(index+" => "+decodedData.rows[index].node.title);
                trace(index+" => "+decodedData.rows[index].node.Result);
            }
            container.addChild(displayComponent);
        }

        function getLabelFieldContent(item:Object):String {
            return new XMLDocument(item.title + "\n" + item.result).firstChild.nodeValue;
        }

        function getSourceFieldContent(item:Object):String {
            return item.result;
        }

    }
}

2 个答案:

答案 0 :(得分:0)

你没有在构造函数中给出container参数类型,即:UIComponent

public function Sign( url:String, container:UIComponent )

这与其成员变量同名的事实可能是原因。

答案 1 :(得分:0)

我不得不使用Flash CS4 GUI将实际的TileList组件从Component Menu拖到舞台上,以免发生此错误。

奇怪的部分是我拖到舞台上的组件不是我在代码中使用的组件。我在代码中动态创建的组件现在可以正常工作。

我甚至删除了我添加到舞台的TileList组件,它仍然有效。这对我来说听起来像个错误。