PDA

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


nelco
19.09.2015, 08:51
здравствуйте, пытаюсь применить прочитанный материал по диспетчеризации событий и не могу разобраться в правильной архитектуре приложения:
например, в объекте Sprite лежат 2 текстовых поля и 2 слушателя для событий MouseEvent.CLICK

package as3Tutorial.scr.tempClasses
{

public class TestEvents extends Sprite
{ public var _container:Sprite = new Sprite();
public var _textField1:TextField = new TextField();
public var _textField2:TextField = new TextField();

public function TestEvents()
{
_textField1.text = "button1";
_textField1.textColor = 0x00FFFF;
_textField2.text = "button2";
_textField2.textColor = 0x00FFFF;
_textField2.x = 300;

_container.addChild(_textField1);
_container.addChild(_textField2);
addChild(_container);

_textField1.addEventListener(MouseEvent.CLICK, clickListener);
_textField2.addEventListener(MouseEvent.CLICK, clickListener);


}

private function clickListener(e:MouseEvent):void

{
if (e.currentTarget == _textField1) {
trace ("_textField1 click");
}
if (e.currentTarget == _textField2) {
trace ("_texField2 click");
}
}

}

}



в Main.as создаю экземпляр этого класса TestEvents


public class Main extends Sprite
{
private var _testEvents:TestEvents = new TestEvents();

public function Main()
{

addChild(_testEvents);
addEventListener(MouseEvent.CLICK, clickListener);

}

private function clickListener(e:MouseEvent):void
{
if(e.target == _button1) {

trace ("нажата кнопка 1 в объекте TestEvents")

}

if (e.target ==_button2) {

trace ("нажата кнопка 2 в объекте TestEvents")

}
}
}



мне нужно, например, чтобы при щелчке мыши на объекте TestEvents создавался новый объект DOC в Main.as (всплывающее окно), который грузил бы в себя кучу DisplayObjectoв

мне нужно в Main.as подписываться на все события MouseEvent.CLICK от всех контейнеров и потом используя switch(e.target) отличать эти все события приходящие из разных объектов друг от друга по e.target или e.name?

а если этих событий будет 100 штук, то их все обрабатывать в Main.as получается надо будет в одной и той же функции-обработчике события MouseEvent.CLICK? если ещё эти 100 событий будут из разных классов-DOC-ов и у них будут разные типы событий, то всё это в Main.as описывать?

neonoviiwolf
19.09.2015, 14:55
а почему бы не описывать в том классе, где они нужны?
а вообще вопрос лучше переформулируйте, у меня голова заболела, пытаясь осилить ваш текст

samana
19.09.2015, 15:00
мне нужно, например, чтобы при щелчке мыши на объекте TestEvents создавался новый объект DOC в Main.as
Немного не понятно, в чём загвоздка. Тогда вам нужно подписать именно _testEvents (находящийся в Main) на клик мышки. А в методе _testEvents_clickListener уже создавать всплывающее окошко.
_testEvents.addEventListener(MouseEvent.CLICK, _testEvents_clickListener);

мне нужно в Main.as подписываться на все события MouseEvent.CLICK от всех контейнеров и потом используя switch(e.target) отличать эти все события приходящие из разных объектов друг от друга по e.target или e.name?

Можно и так, смотря какая ситуация в данный момент будет удобна. Но в любом случае, если у вас в Main 100 объектов, и вы хотите, чтобы при клике на каждом их них выполнялось особенное действие именно в Main, то без подписок на MouseEvent.CLICK не обойтись. Либо диспатчить событие из каждого кликнутого объекта и в Main ловить их. Но это практически то же самое. Вобщем нужно узнать конкретную ситуацию вашей задумки.

Wolsh
20.09.2015, 01:20
if(e.target == _button1) {Но у Вас нет никакого объекта _button1