ADDED_TO_STAGE 函数从未被调用

ADDED_TO_STAGE function never called

我有这个 class 应该从舞台上拿一个按钮 (xBtn)。

package com.stx.utils {

    import flash.display.MovieClip;
    import flash.events.*;

    public class STXbutonx extends MovieClip {

        private var xBtn  : MovieClip;

        public function STXbutonx() {
            addEventListener(Event.ADDED_TO_STAGE, init);           
        }

        private function init(e:Event=null) : void {
            trace("int!"); //this is never called
            xBtn = stage.getChildByName('ics') as MovieClip;
            xBtn.addEventListener(MouseEvent.CLICK, onX);
            removeEventListener(Event.ADDED_TO_STAGE, init);
        }

        private function onX(e:MouseEvent) : void {
            trace("x Clicked!");
        }
    }
}

在文档 class 中,我这样调用:

import flash.display.MovieClip;
import com.stx.utils.*;

public class Main extends MovieClip {

    var xx : STXbutonx;

    public function Main() {    
        xx = new STXbutonx();
    }
}

为什么我的 init 函数从未被调用?
谢谢!

因为你从来没有把它添加到舞台上。

将您的文档 class 更改为

public function Main() {    
    xx = new STXbutonx();
    addChild(xx);
}

Main 持有对舞台的引用,将子级添加到 Main 会将子级添加到舞台。因此,STXbutonx 中的事件侦听器将触发。


xBtn = stage.getChildByName('ics') as MovieClip; // now I have acces of undefined property stage...

您无权访问舞台,因为 STXButon 不在舞台上,它不是 DisplayObject。要解决这个问题,请执行以下操作:

包com.stx.utils{

import flash.display.MovieClip;
import flash.events.*;

public class STXbutonx{

    private var xBtn  : MovieClip;
    private var stage : Stage;

    public function STXbutonx(stage:Stage) {
        this.stage = stage;
        init();           
    }

    private function init() : void {
        trace("int!");
        xBtn = stage.getChildByName('ics') as MovieClip;
        xBtn.addEventListener(MouseEvent.CLICK, onX);
        removeEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function onX(e:MouseEvent) : void {
        trace("x Clicked!");
    }
}

}

当然

import flash.display.MovieClip;
import com.stx.utils.*;

public class Main extends MovieClip {

var xx : STXbutonx;

public function Main() {    
    xx = new STXbutonx(stage);
}

}