2011-04-08 89 views
0

我从一个事件调度器调度一个自定义事件(解决方案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 

} 

回答

3

为了使您的主类实例从EventDispatcherManager接收事件,必须将main注册为具有EventDispatcherManager的侦听器。

喜欢的东西:

//in main: 
sliderSprite.eventDispatcherManager.addEventListener(CustomEvent.CUSTOM_EVENT_TYPE,onCustomEvent); 

但是对于工作,你就必须要么设置_eventDispatcherManager propterty公共OCH使其通过访问,或者一个简单的GET功能的访问。

虽然我会强烈建议您查看结构。从它的外观你可以跳过EventDispatcherManager类和CustomEvent类,并直接从SliderEvent将值直接分配给Main。

但这可能只是一个演示例子?

编辑:

这是一个getter函数会是什么样子:

function get eventDispatcherManager():EventDispatcherManager { 
     return _eventDispatcherManager; 
} 

把在你的SliderSprite类函数,只是因为我从如上所述主要调用它。

+0

我认为他只是试图把握事件调度和自定义事件的概念。我想通过向他展示如何封装用于调度事件,监听事件和调用事件处理程序的逻辑,让这个主题更加混乱。我应该提到这不是一个好的做法。 – Taurayi 2011-04-08 20:27:19

+0

你还可以在你的回答中提及(并举例说明)他还必须使'_eventDispatcherManager'对象可公开访问,最好使用getter方法。通过这种方式,我可以对您的答案进行投票,并建议这个答案应该是这个问题的接受答案(我知道它已经暗示您可以公开访问它,但为了使答案达到最佳状态) 。 – Taurayi 2011-04-08 20:33:02

+0

你可以跳过EventDispatcherManager类和CustomEvent类,直接将SliderEvent中的值直接分配给Main:我已经完成了,现在我想要一个单独的类将它从GUI分派给它。 – user310291 2011-04-08 21:04:03

0

你应该在ActionScript 3 我读到event phases简而言之,您的EventDispatcherManager不是DisplayObject,并且不在显示列表中。这就是为什么,你的自定义事件不会冒泡,也不会触及你的主体。

+0

那么我能做些什么来泡到主要? – user310291 2011-04-08 21:11:01

+0

我没有觉得这个回应有帮助。事件可以让显示链起泡,这对鼠标点击等某些事情是非常有意义的,但这不是你想要的,因为你的EventDispatcherManager不是一个DisplayObject,它对我来说没有任何意义一。 Tjofras的回应有你以后..你需要注册你的侦听器与你的EventDispatcherManager实例。 – 2011-04-09 00:16:33

相关问题