我在AS3的事件处理方面遇到了奇怪的问题。
我有两节课:
public class Configurator extends Sprite {
public function Configurator () {
this.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, this._test);
var fp = new FramedPhoto();
}
protected function _test(event:Event) {
trace('_test()');
}
}
和第二个:
public class FramedPhoto extends Sprite {
public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';
public function FramedPhoto () {
trace('FramedPhoto()');
this.dispatchEvent(new Event(FramedPhoto.FRAMED_PHOTO_LOADED, true, false));
}
}
问题是_test()没有被触发。有什么想法可以做错吗?
包含源文件的测试包可从http://blackbox.home.pl/test.zip
获得答案 0 :(得分:1)
事件以分层方式分派,因此只需在任何地方都可以监听事件。
您需要做的是让配置程序在显示列表中监听调度事件的对象或上面的。如果你想要捕捉所有事件,你需要听取它们的最顶层对象,stage
。
答案 1 :(得分:1)
在您的情况下,如果您希望配置器显示对象听到从FramedPhoto显示对象调度的事件,则必须将FramedPhoto添加到其显示列表中。
我冒昧地为你的项目添加一个文档类,因为你应该避免使用时间轴。
package
{
import com.Configurator;
import flash.display.MovieClip;
public class Main extends MovieClip
{
public function Main():void
{
init();
}// end function
private function init():void
{
var configurator:Configurator = new Configurator();
addChild(configurator);
}// end function
}// end class
}// end package
我导入了Configurator类(将包从abc重命名为com),声明,实例化并将其添加到显示列表中。
package com
{
import com.FramedPhoto;
import flash.display.Sprite;
import flash.events.Event;
public class Configurator extends Sprite
{
public function Configurator():void
{
var framedPhoto:FramedPhoto = new FramedPhoto();
addChild(framedPhoto);
framedPhoto.addEventListener(FramedPhoto.FRAMED_PHOTO_LOADED, framedPhotoLoadedHandler);
}// end function
public function framedPhotoLoadedHandler(e:Event):void
{
trace("framePhotoLoadedHandler()");
}// end function
}// end function
}// end function
接下来在Configurator类中,我导入了FramedPhoto类,声明并实例化它。然后我添加了一个事件监听器,它监听从framePhoto显示对象调度的事件并调用framedPhotoLoadedHandler()。
package com
{
import flash.display.Sprite;
import flash.events.Event;
public class FramedPhoto extends Sprite
{
public static const FRAMED_PHOTO_LOADED = 'framedPhotoLoaded';
public function FramedPhoto():void
{
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}// end function
private function addedToStageHandler(e:Event):void
{
dispatchEvent(new Event(FRAMED_PHOTO_LOADED, true));
}// end function
}// end function
}// end function
最后在FramePhoto类中,我添加了一个事件监听器,它监听FramePhoto显示对象何时被添加到舞台。当它被添加到舞台时,它将调用addedToStageHandler(),它将调度该事件并将被捕获到父Configurator显示对象中。
我希望这有助于:)