PDA

Просмотр полной версии : Не ловится событие


$mival
10.09.2008, 11:48
Есть класс который наследуется от спрайта, является чилдом stage и подписывается на событие у stage


public class Panel extends Sprite
{
public function Panel()
{
this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}

private function onAdded(e:Event):void
{
stage.addEventListener(PanelEvent.PANEL_EVENT, addText);
...
}
...
}


в некотором мувике который глубоко по иерархии по нажатию кнопки создается экземпляр класса который стреляет событием

hit.addEventListener(MouseEvent.CLICK, playClick);

private function playClick(e:MouseEvent):void
{
new PanelEvent("hello world!");
}

собсна сам PanelEvent

...
public class PanelEvent extends EventDispatcher
{
public static const PANEL_EVENT:String = "PanelEvent";
public var str:String;

public function PanelEvent(text:String)
{
str = text;
dispatchEvent(new Event(PanelEvent.PANEL_EVENT, true));
}
}

если в мувике с экземпляром класса события написать так

private function playClick(e:MouseEvent):void
{
//new PanelEvent("hello world!");
dispatchEvent(new Event(PanelEvent.PANEL_EVENT, true));
}
то всё работает. почему так происходит?

wvxvw
10.09.2008, 12:05
Помоему всплывающие события доступны только наследникам DisplayObject...

mre
10.09.2008, 12:08
PanelEvent нужно наследовать от Event а не от EventDispatcher.
И диспатчить событие все равно придется в DisplayObject, который находится в DisplayList.

etc
10.09.2008, 12:42
Константа PANEL_EVENT при таком имени должна содержать значение "panelEvent". А вообще, подобное название событие ни о чём не говорит разработчику. «Событие панели». Какое событие? Клик? Перемещение? Никакой информации, совершенно.
Имена событий в Flash Player не от балды написаны, они конкретно описывают происходящее событие. Ваше же — не описывает.

$mival
10.09.2008, 12:46
PanelEvent нужно наследовать от Event а не от EventDispatcher.

Вы не правы, как бы я тогда использовал dispatchEvent()?


И диспатчить событие все равно придется в DisplayObject, который находится в DisplayList.

действительно :(

etc
10.09.2008, 12:51
Вы не правы, как бы я тогда использовал dispatchEvent()?
А причем тут сам Event и метод dispatchEvent у EventDispatcher?

$mival
11.09.2008, 10:13
А вообще, подобное название событие ни о чём не говорит разработчику. «Событие панели». Какое событие? Клик? Перемещение? Никакой информации, совершенно.
Имена событий в Flash Player не от балды написаны, они конкретно описывают происходящее событие. Ваше же — не описывает.

Эта панель ловит только одно событие, так будет всегда.
Именно поэтому оно было названо так.
Или "правила хорошего тона" не позволяют халтурить и в таких случаях? :)

А причем тут сам Event и метод dispatchEvent у EventDispatcher?

Ну товарищ mre посоветовал наследоваться от Event,
это мне надо было бы потом создавать внутри класса диспатчер,
отправлять событие, удалять диспатчер.
В чем преимущество наследования от Event а не от EventDispatcher в этом случае?

etc
11.09.2008, 10:21
Или "правила хорошего тона" не позволяют халтурить и в таких случаях? :)
Халтурить вообще нельзя.

В чем преимущество наследования от Event а не от EventDispatcher в этом случае?
Боже мой, Event — это событие, а EventDispatcher — тот, кто их рассылает. EventDispatcher не рассылает EventDispatcher-ы, а вы пытаетесь так сделать, непонятно, на каком основании.

$mival
11.09.2008, 10:28
Боже мой, Event — это событие, а EventDispatcher — тот, кто их рассылает. EventDispatcher не рассылает EventDispatcher-ы, а вы пытаетесь так сделать, непонятно, на каком основании.

разве я не Event отсылаю?

dispatchEvent(new Event(PanelEvent.PANEL_EVENT, true));

можете посоветовать как надо на коде?

etc
11.09.2008, 10:35
разве я не Event отсылаю?
Отсылаете вы Event, конечно, поэтому ваш код работает. А должны рассылать new PanelEvent(PanelEvent.PANEL_EVENT, true) как минимум.

можете посоветовать как надо на коде?
Надо открыть документацию по событийной модели ActionScript и всё-всё там прочитать и понять.