我有这个课程,应该从舞台上取一个按钮( 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!");
}
}
}
在Document类中我这样调用:
import flash.display.MovieClip;
import com.stx.utils.*;
public class Main extends MovieClip {
var xx : STXbutonx;
public function Main() {
xx = new STXbutonx();
}
}
为什么我的init函数永远不会被调用?
谢谢!
答案 0 :(得分:1)
因为你从未将它添加到舞台上。
将您的Document类更改为
public function Main() {
xx = new STXbutonx();
addChild(xx);
}
Main保存对舞台的引用,向Main添加子项将子项添加到舞台。因此,STXbutonx中的事件监听器将触发。
xBtn = stage.getChildByName(' ics')为MovieClip; //现在我有未定义属性阶段的访问权限......
您无法访问舞台,因为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);
}
}