2

我正在尝试调用模块的函数(具有两个参数)并为其赋值。我可以看到在跟踪中分配的值,但是在分配给标签时没有显示相同的值。

  1. 如果我直接将值分配给标签。它说:

    错误:1009:空对象引用

  2. 如果我[Bindable]对该标签使用元标记,它不会显示任何运行时错误,但也不会显示该值。我在互联网上搜索过,发现[Bindable]元标记可以用作 try and catch 博客。

如何将值显示分配给标签?

Main.mxml

 <?xml version="1.0" encoding="utf-8"?>
  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"   xmlns:custom="com.custom.*" xmlns:local="*" creationComplete="onload()">
  <mx:Script>
<![CDATA[
    import modules.AModule; 
    import mx.events.ModuleEvent;
    import mx.containers.VBox;
    import mx.containers.TitleWindow;
    import mx.controls.TextInput;
    import mx.controls.Button;
    import mx.containers.HBox;
    import mx.controls.Label;
    import mx.events.CloseEvent;
    import mx.controls.Text;
    import com.custom.CustomAlert;
    import mx.controls.Alert;
    import mx.containers.Canvas;
    import mx.events.ItemClickEvent;

    import mx.core.UIComponent;

    import mx.modules.ModuleManager;
    import mx.modules.IModuleInfo;
    import mx.containers.Box;
    import mx.controls.ProgressBar;

    //private var can:Canvas;

    public var titlewin:TitleWindow = new TitleWindow();
        public var usern:TextInput = new TextInput();
        public var passw:TextInput = new TextInput();
        public var vb:VBox = new VBox();
        public var hb1:HBox = new HBox();
        public var hb2:HBox = new HBox();
        public var hb3:HBox = new HBox();
        public var nc:NetConnection;

        public var bt1:Button = new Button();

        private var pb:ProgressBar;
    private var progressContainer:Box;
    private var info:IModuleInfo;
    private var module:UIComponent = null;
    public var can:Canvas= new Canvas();
    public function onload():void
    {
            var label1:Label= new Label();
        var label2:Label= new Label();
        label1.text="Username";
        label2.text="Password ";
        hb1.addChild(label1);
        hb1.addChild(usern);
        hb2.addChild(label2);
        hb2.addChild(passw);
        vb.addChild(hb1);
        vb.addChild(hb2);           
        bt1.label="Sign In";
        hb3.addChild(vb);
        hb3.addChild(bt1);
        titlewin.addChild(hb3);

        //Title Window creation starts here
        titlewin.title="Login";

        titlewin.setStyle("paddingLeft",20);
        titlewin.setStyle("paddingRight",20);
        titlewin.setStyle("paddingTop",20);
        titlewin.setStyle("paddingBottom",20);
        titlewin.setStyle("borderThicknessBottom",0);
        titlewin.setStyle("borderThicknessLeft",0);
        titlewin.setStyle("borderThicknessRight",0);
        titlewin.setStyle("borderThicknessTop",0);
        titlewin.setStyle("cornerRadius",0);
        titlewin.setStyle("borderColor","#D20101");
        this.addChild(titlewin);
        viewStack.enabled=false;
        ctbb.enabled=false;
        bt1.addEventListener(MouseEvent.CLICK, netconn);

    }

    private function onclick():void
    {
        if(usern.text!="")
        {
    this.removeChild(titlewin);
    viewStack.enabled=true; 
    ctbb.enabled=true;
    username.text=usern.text;
        }
        else
        {
            Alert.show("Please enter Username");
        }
    }


    private function netconn(event:MouseEvent):void
    {
        nc = new NetConnection();
        nc.connect("rtmp://localhost/loginhere",usern.text);
        nc.addEventListener(NetStatusEvent.NET_STATUS, onstatushandler);

    }

    private function onstatushandler(event:NetStatusEvent):void
    {
        if(event.info.code=="NetConnection.Connect.Success")
        {
            status.text="Connected";
        onclick();  
            }


        if(event.info.code=="NetConnection.Connect.Rejected")
        {
            status.text="Rejected";
        }
        if(event.info.code=="NetConnection.Connect.Failed")
        {
                status.text="Failed";
        }
    }



    private function JoinClick(event:MouseEvent):void{

        if(viewStack.numChildren==3)
        {
            Alert.show("You Cant Add More Button","Alert");

        }

        if(viewStack.numChildren<3)
        {

        if(viewStack.numChildren<2)
        {
        can.label="Button2";
        var button1:CustomButton= new CustomButton();
        button1.label="Leave Table";
        button1.x=300;
        button1.y=200;
        var txt:Text = new Text();
        txt.text=can.label;
        txt.x=50;
        txt.y=50;
        button1.addEventListener(MouseEvent.CLICK,remove2);
        can.addChild(button1);
        can.addChild(txt);
        loadmodule();
        }
        else
        {

        can.label="Button3";
        var button2:CustomButton= new CustomButton();
        button2.label="Leave Table";
        button2.x=300;
        button2.y=200;
        button2.addEventListener(MouseEvent.CLICK,remove3);
        can.addChild(button2);
        var txt1:Text = new Text();
        txt1.text=can.label;
        txt1.x=50;
        txt1.y=50;
        can.addChild(txt1);
        }
        can.setStyle("backgroundColor","0x5EA5BA");
        viewStack.addChild(can);
        if(viewStack.numChildren>2)
        {
            viewStack.selectedIndex=2;
        }
        else
        {
        viewStack.selectedIndex=1;
        }
        }

        }


        private function remove2(event:MouseEvent):void{
        Alert.show("Do you want to Leave    Table?","Confirmation",Alert.YES|Alert.NO,this,closeAlert2);
        }
        private function closeAlert2(event:CloseEvent):void{
        if(event.detail==Alert.YES)
        {
        viewStack.removeChildAt(1);
        }

        }
        private function remove3(event:MouseEvent):void{
        if(viewStack.numChildren>2)
        {
            Alert.show("Do You want to leave Table?","Confirmation",Alert.YES|Alert.NO,this,closeAlert3);

        }
        else
        {
            Alert.show("Do you want to Leave Table?","Confirmation",Alert.YES|Alert.NO,this,closeAlert1);

        }
        }

        private function closeAlert1(event:CloseEvent):void{
            if(event.detail==Alert.YES)
            {
                viewStack.removeChildAt(1);

            }
        }
        private function closeAlert3(event:CloseEvent):void{
            if(event.detail==Alert.YES)
            {
                    viewStack.removeChildAt(2);
            }
        }


            private function loadmodule():void
    {
            pb = new ProgressBar();
            pb.labelPlacement = "center";
            pb.label = "Loading %3 %";
            progressContainer = new Box();
            progressContainer.percentWidth = 100;
            progressContainer.percentHeight = 100;
            progressContainer.setStyle("horizontalAlign", "center");
            progressContainer.setStyle("verticalAlign", "middle");
            progressContainer.addChild(pb);  
            can.addChild(progressContainer);


        var moduleUrl:String="../bin-debug/modules/useModule.swf";
        info=ModuleManager.getModule(moduleUrl);
        if(info!=null)
        {
            info.addEventListener(ModuleEvent.READY, modEventHandler);
            info.addEventListener(ModuleEvent.ERROR,modErrorHandler);
            info.load();
        }
    }



    private function modEventHandler(e:ModuleEvent):void
    {
        info.removeEventListener(ModuleEvent.READY, modEventHandler);
        info.removeEventListener(ModuleEvent.ERROR, modErrorHandler);
        can.removeAllChildren();
        if(module==null)
        {

            module = info.factory.create() as UIComponent;
            if(module!=null)
            { 
                module.x=0;
                module.y=0;
                module.percentWidth=100;
                module.percentHeight=100;
                can.addChild(module);
                 if(module is AModule)
                {

                } 
            }
        }
        }

            private function modErrorHandler(event:ModuleEvent):void {


            //cleanup and display an error alert
            info.removeEventListener(ModuleEvent.READY, modEventHandler);
            info.removeEventListener(ModuleEvent.ERROR, modErrorHandler);
            info = null;
            Alert.show(event.toString(), "Error Loading Module");

          unloadModule();
        }   
                private function unloadModule():void 
                {
           can.removeAllChildren();
            if (module != null && info != null) {
                info.addEventListener(ModuleEvent.UNLOAD,    unloadEventHandler);
                info.unload();
            }
        }

                private function unloadEventHandler(e:ModuleEvent):void 
                {
            info.removeEventListener(ModuleEvent.UNLOAD, unloadEventHandler);
            module = null;
            info = null;
                 }


]]>
  </mx:Script>

 <mx:Canvas width="700" height="400" x="166" y="32">
 <mx:ViewStack id="viewStack"  width="100%" height="100%">
    <mx:Canvas label="Button1" backgroundColor="#5EA5BA" visible="true" id="can1" >
    <local:CustomButton label="Join" click="JoinClick(event)"  x="536" y="222"/>
    <mx:Label x="304" y="120" text="Label" id="username"/>
    <mx:Label x="304" y="55" text="Label" id="status"/>
    </mx:Canvas> 
</mx:ViewStack>

 </mx:Canvas>
  <custom:CustomControlBar x="166" y="423" id="ctbb">
  <custom:CustomToggleButtonBar  dataProvider="viewStack"/>
  </custom:CustomControlBar>

  </mx:Application>

使用模块.mxml

  <?xml version="1.0" encoding="utf-8"?>
 <mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="508"  height="218" implements="modules.AModule" backgroundColor="#F00F0F"  creationComplete="addlabel();">
<mx:Script>
    <![CDATA[
        import mx.core.Application;

        public var logsin:loginhere = new loginhere();
        public function addlabel():void
        {
            lb1.text=logsin.username.text;
            txt3.text=logsin.username.text;
            trace(txt3.text);
            trace(lb1.text);
        }


    ]]>
</mx:Script>

    <mx:TextInput id="txt3" x="30.5" y="10" width="79"/>
    <mx:Label id="lb1" x="31.5" y="40" width="78" text="Will it Change?"/>
</mx:Module> 

AModule.as(它的一个接口)

package modules
{  
import flash.events.IEventDispatcher;

public interface AModule extends IEventDispatcher
{
    function addlabel():void;
}
}
4

2 回答 2

0

我没有查看整个代码,但我注意到的一件事是您应该将值作为参数传递给子组件并使用数据绑定来动态更新参数。

所以在 AModule.as 中:

<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="508"  height="218" implements="modules.AModule" backgroundColor="#F00F0F"  creationComplete="addlabel();">
<mx:Script>
    <![CDATA[
        import mx.core.Application;

        public var logsin:loginhere = new loginhere();

        [Bindable]
        public var username:String = "";
    ]]>
</mx:Script>

    <mx:TextInput id="txt3" text="{username}" x="30.5" y="10" width="79"/>
    <mx:Label id="lb1" text="{username}" x="31.5" y="40" width="78" text="Will it Change?"/>
</mx:Module> 

在您创建模块的方法中,您可以:

module.username = //var that holds username;
于 2012-10-18T10:50:49.520 回答
0

我错过的一点是,我试图在 main.mxml 中为接口创建一个实例 var 应该在函数中创建 modEventHandler在该函数中,应该添加以下行

ichild=module as AModule;

ichild.addlabel(tt.text);

所以模块被调用并且值显示在标签字段中。

请让我知道,如果它的工作方式错误。谢谢你

于 2012-10-18T17:32:32.853 回答