Apache flex 在类之间调度事件

Apache flex 在类之间调度事件,apache-flex,actionscript-3,events,Apache Flex,Actionscript 3,Events,我有一个自定义的事件类 public class FFTDrawEvent extends Event { public static const DRAW_EVENT:String = "drawEvent"; private var _param:Array = new Array(); public function FFTDrawEvent(type:String, __param:Array, bubbles:Boolean=true, cancelabl

我有一个自定义的事件类

public class FFTDrawEvent extends Event {

    public static const DRAW_EVENT:String = "drawEvent";

    private var _param:Array = new Array();

    public function FFTDrawEvent(type:String, __param:Array, bubbles:Boolean=true, cancelable:Boolean=false) {
        _param = __param;
        super(type, bubbles, cancelable);
    }

    public function get param():Array {
        return _param;
    }
}
此事件由一个类调度,该类扩展了
EventDispatcher

public class ToneGenerator extends EventDispatcher {

 public function someFunction():void {

 this.dispatchEvent(new FFTDrawEvent(FFTDrawEvent.DRAW_EVENT,_param));
}
另一个班级听这个事件。此类正在扩展SpriteVisualElement

public class SpectrumVisualizer extends `SpriteVisualElement`:
{
    public function SpectrumVisualizer()
    {
        this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
    }
不幸的是,这不起作用。事件被调度(返回true),但事件侦听器从未被触发

这两个类(Dispatcher和Listener)都是MXML应用程序的子类。还要侦听父MXML应用程序中的事件不起作用。在分派类中侦听事件本身以某种方式起作用

我不得不感觉EventDispatcher类不是将事件分派到mxml应用程序的合适类,也不是从mxml组件类扩展/固有的类

有人能帮我吗

马丁

问题是侦听器侦听本身,而不是侦听事件调度器。以下是正确的代码:

public class SpectrumVisualizer extends SpriteVisualElement
{
    public function SpectrumVisualizer()
    {
        toneGenerator = new ToneGenerator();
        toneGenerator.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
        toneGenerator.someFunction();
    }

    private var toneGenerator:ToneGenerator;

    private function draw(event:FFTDrawEvent):void
    {
        trace("draw");
    }

}


注:如果你试图使用冒泡,请参阅文档中的相应部分。在这里它不起作用,因为事件“泡泡”仅出现在显示列表中,而ToneGenerator不是可视对象(精灵、MovieClip等)。

您应该在调度程序上侦听事件。在您的情况下,
ToneGenerator
的一个实例正在调度事件,而
SpectrumVisualizer
正在侦听-它无法工作

在分派类中侦听事件本身以某种方式起作用

这是唯一可行的办法

当你打电话的时候

this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
您告诉
this
对象调用
this.draw
方法,只要它(this对象)调度类型为
FFTDrawEvent.draw\u event
的事件。换成

toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);
现在,您告诉
toneGen
对象调用
this.draw
方法,只要它(
toneGen
对象)调度类型为
FFTDrawEvent.draw\u event
的事件

您还可以从父mxml执行以下操作

toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, specVis.draw);

每当
toneGen
对象分派类型为
FFTDrawEvent的事件时,调用
specVis.draw
方法。draw\u event
冒泡在非可视对象上不起作用太糟糕了。这对我来说是一个松散耦合我的类的好方法。我就是这样做的。但另一方面,我正在失去这两个类的松散耦合。现在,ToneGenerator是SpectrumVisualizer的一个实例。但无论如何,它是这样工作的,结果更重要。谢谢。@Martin“现在ToneGenerator是SpectrumVisualizer的一个实例”你为什么要这么做?让它们保持独立,并从包含这两个侦听器的父级添加侦听器。从某种意义上说,事件是类的公共接口的一部分,所以这样做没有错。