我从一个事件调度器调度一个自定义事件(解决方案Inherited a class from EventDispatcher in Flash but custom event not received),我在调度器本身和main中都添加了一个监听器。跟踪显示只有调度员收到此事件不是主要的。如何让主要也收到事件?为什么我只在EventDispatcher中接收自定义事件而不在main中?
package
{
import flash.display.Sprite;
import flash.events.Event;
public class main extends Sprite
{
private var _sliderSprite:SliderSprite;
public function main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}// end function
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
_sliderSprite = new SliderSprite();
_sliderSprite.x = (stage.stageWidth/2);
_sliderSprite.y = (stage.stageHeight/2);
addChild(_sliderSprite);
this.addEventListener(CustomEvent.CUSTOM_EVENT_TYPE, onCustomEventType);
}// end function
private function onCustomEventType(e:CustomEvent):void
{
// never triggered
trace("hello");
}// end function
}// end class
}// end package
类2
package {
import flash.display.Sprite;
import flash.events.IEventDispatcher;
import fl.controls.Slider;
public class SliderSprite extends Sprite
{
private var _slider:Slider;
private var _eventDispatcherManager:EventDispatcherManager;
public function SliderSprite()
{
init();
}// end function
private function init():void
{
_slider = new Slider();
addChild(_slider);
_eventDispatcherManager = new EventDispatcherManager(IEventDispatcher(_slider));
}// end function
}// end class
}
类3
package {
import fl.controls.Slider;
import fl.events.SliderEvent;
import flash.events.*;
internal class EventDispatcherManager extends EventDispatcher
{
public function EventDispatcherManager(slider:IEventDispatcher)
{
slider.addEventListener(SliderEvent.CHANGE, onSliderChange);
this.addEventListener(CustomEvent.CUSTOM_EVENT_TYPE, onCustomEventType);
}// end function
private function onSliderChange(e:SliderEvent):void
{
this.dispatchEvent(new CustomEvent(CustomEvent.CUSTOM_EVENT_TYPE, e.value));
}// end function
private function onCustomEventType(e:CustomEvent):void
{
// triggered
trace(e.value);
}// end function
}// end function
}
类4
package {
import flash.events.Event;
internal class CustomEvent extends Event
{
public static const CUSTOM_EVENT_TYPE:String = "customEventType";
private var _value:Number;
public function get value():Number
{
return _value;
}// end function
public function CustomEvent(type:String,
value:Number,
bubbles:Boolean = false,
cancelable:Boolean = false)
{
_value = value;
super(type, bubbles, cancelable);
}// end function
override public function clone():Event
{
return new CustomEvent(type, value, bubbles, cancelable);
}// end function
}// end class
}
我认为他只是试图把握事件调度和自定义事件的概念。我想通过向他展示如何封装用于调度事件,监听事件和调用事件处理程序的逻辑,让这个主题更加混乱。我应该提到这不是一个好的做法。 – Taurayi 2011-04-08 20:27:19
你还可以在你的回答中提及(并举例说明)他还必须使'_eventDispatcherManager'对象可公开访问,最好使用getter方法。通过这种方式,我可以对您的答案进行投票,并建议这个答案应该是这个问题的接受答案(我知道它已经暗示您可以公开访问它,但为了使答案达到最佳状态) 。 – Taurayi 2011-04-08 20:33:02
你可以跳过EventDispatcherManager类和CustomEvent类,直接将SliderEvent中的值直接分配给Main:我已经完成了,现在我想要一个单独的类将它从GUI分派给它。 – user310291 2011-04-08 21:04:03