解决AsWing程序被载入后的出错

一个AsWing程序,单独运行正常,但是如果用另一个swf去载入这个程序,就可能出错,如下代码:

package
{
	import flash.display.Sprite;
 
	import org.aswing.AsWingManager;
	import org.aswing.JFrame;
 
	public class Sub extends Sprite
	{
 
		public function Sub()
		{
			createFrame();
		}
 
		private function createFrame():void
		{
			AsWingManager.setRoot(this);
			var frame:JFrame = new JFrame(this, "frame");
			frame.setSizeWH(200, 200);
			frame.show();
		}
 
	}
}

这段程序单独运行没有问题,但是如果我们写一个loader
package
{
	import flash.display.Sprite;
	import flash.display.Loader;
	import flash.net.URLRequest;
 
	public class Parent extends Sprite
	{
		public function Parent()
		{
			var loader:Loader = new Loader();
			loader.load(new URLRequest("Sub.swf"));
			addChild(loader);
		}
 
	}
}

我们用Parent去载入Sub.swf,当运行Parent.swf的时候就会出错:

我认为原因在于AsWing在初始化的时候要调用AsWingManager.getStage(),如果AsWingManager中的stage属性找不到,那就会抛出上面的错误,可是明明已经调用了AsWingManager.setRoot(this);(这个方法调用后AsWingManager.stage会引用传给setRoot方法的DisplayObjectContainer的stage)了啊。

由于Sub.swf是通过Parent.swf加载的,所以在Sub的init事件还没触发的时候,也就是被加载的swf还未完全初始化的时候,是得不到stage属性的。可以尝试在Sub的构造函数中trace(this.stage);然后用debug模式运行Parent,输出的是null

这样出错的原因找到了,就可以去解决了,方法就是把AsWingManager.setRoot和创建AsWing程序的代码放在init事件触发之后。
修改Sub.as的代码:

public function Sub()
{
	this.loaderInfo.addEventListener(Event.INIT, onInit);
}
 
private function onInit(e:Event):void
{
	createFrame();
}

这样就行了 :)

评论