Диспетчеризация событий между классами - PullRequest
3 голосов
/ 25 июня 2010

У меня есть пользовательский класс событий

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);
    }

К сожалению, это не работает. Событие отправляется (возвращается с истиной), но прослушиватель событий никогда не запускается.

Оба класса (Dispatcher & Listener) являются дочерними классами приложения MXML. Также прослушивание события в родительском приложении MXML не работает. Прослушивание события в самом диспетчерском классе как-то работает.

Мне кажется, что класс EventDispatcher не подходит для отправки событий в приложение mxml или соответственно в классы AS, которые расширяются / свойственны классу компонентов MXML.

Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

3 голосов
/ 25 июня 2010

Вы должны слушать события на диспетчере.В вашем случае экземпляр ToneGenerator отправляет событие, а SpectrumVisualizer прослушивает - это не сработает.

Прослушивание события в самом классе диспетчеризации как-то работает.

Это единственный способ, которым он будет работать.

Когда вы вызываете

this.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);

, вы указываете this объекту вызывать метод this.draw всякий раз, когда он (this объект) отправляет событие типа FFTDrawEvent.DRAW_EVENT.Измените его на

toneGen.addEventListener(FFTDrawEvent.DRAW_EVENT, draw);

Теперь вы говорите toneGen объекту вызывать метод this.draw всякий раз, когда он (объект toneGen) отправляет событие типа FFTDrawEvent.DRAW_EVENT.

.Вы также можете сделать следующее из родительского mxml.

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

Вызывать метод specVis.draw всякий раз, когда объект toneGen отправляет событие типа FFTDrawEvent.DRAW_EVENT.

1 голос
/ 25 июня 2010

Martin,

Проблема в том, что слушатель слушает сам вместо прослушивания диспетчера событий.Вот правильный код:

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");
    }

}

Это поможет вам понять события.

PS: Если вы пытались использовать всплывающее окно, см. Соответствующий раздел в документации,Здесь это не работает, потому что события «всплывают» только в списке отображения, пока ToneGenerator не является визуальным объектом (Sprite, MovieClip, ...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...