Просмотр полной версии : создание произвольного количества кнопок и прослушивание их событий
Вопрос хоть и ламерский, но ответа найти не могу((
вообщем есть у меня много элементов, типа пользователи и у каждого есть своя кнопочка, как можно все эти кнопки вывести на показ и отслеживать события происходящие при их нажатии
вот что я придумал есть массив с пользователями, ники, ip, прочая фигня туда же добавляем кнопки для каждого свои
далее перебераем нужные мам элементы и рисуем кнопки на экране, дальше промблемма(( как сделать так что бы можно было каждой кнопке своего слушателя назначить , как динамически создать функции с разными именами.
Stitch512
24.01.2012, 04:27
Сделай одного слушателя и кастомное событие, куда будет передеваться идентификатор конкретного пользователя либо другая нужная информация.
kelod, зачем Вам разные обработчики? Вы собираетесь делать разные действия с пользователями?
Stitch512, зачем создавать кастомное событие, если ссылка на кнопку есть в обычном MouseEvent? Кастомный MouseEvent Вы не создадите, а если надо просто передать айдишник кнoпки/юзера, то есть дефолтный DataEvent.
Stitch512
24.01.2012, 05:51
Иногда удобнее в событие передать необходимые данные для обработки, чем получать их потом на строковому идентификатору, но если необходимости в этом нет то да, можно и дефолтным событием. Вообще зависит от задачи, но я абстрактным событиям типа MouseEvent предпочитаю пользовательские, меньше телодвижений для получения нужной информации в обработчике.
"Абстрактные события"? Не, не слышал. Событие без реализации, без экземпляра?
"событиям типа MouseEvent предпочитаю пользовательские" – боюсь только, InteractiveObject не разделяет Ваших вкусов.
Расскажите, как Вы ловите клик по объекту, не подписываясь на MouseEvent?
я всё равно сто то не пойму, если сделать 1 событие на несколько кнопок, как я узнаю которая нажата? не могли бы Вы привести примерчик кода, хотя бы приблизительный
carrotoff
24.01.2012, 11:05
узнать, какая нажата кнопка, можно с помощью свойства currentTarget объекта MouseEvent.
..
button.addEventListener(MouseEvent.CLICK, _onClick);
..
private function _onClick(e:MouseEvent):void{
trace("Нажата кнопка: " + e.currentTarget);
}
кажется разобрался, присвоил кнопкам имена и теперь можно их через currentTarget.name различать)
booksmaster
24.01.2012, 12:25
совершенно верно.
А вот так можно к любому объекту обратиться по имени
private function getObjectByName(n:String,par:DisplayObjectContainer):DisplayObject{
for (var i:int = 0;i<par.numChildren;i++)
{
if (par.getChildAt(i).name==n) {return par.getChildAt(i);} else {if (par.getChildAt(i) is DisplayObjectContainer) {
var t:DisplayObject = getObjectByName(n,DisplayObjectContainer(par.getChildAt(i)));
if (t!=null) {return t}}}
}
return null;
}
Передаешь в функцию имя и контейнер, в котором объект предположительно находится. Ищет только отображаемые объекты(естественно). Роет вглубь, так что если объект является чайлдом объекта par в н-ом поколении, все равно находит. В общем случае в par можно передать просто stage.
Stitch512
24.01.2012, 14:05
Расскажите, как Вы ловите клик по объекту, не подписываясь на MouseEvent?
Я и не говорил что не подписываться. Кнопку и все необходимые данные помещаем в класс-контейнер, в нем подписываемся на MouseEvent по нему шлем события к примеру ButtonClick с нужными данными, по сути MouseEvent получается инкапсулировано и извне видно только событие данного контейнера. Если потом внутренняя логика поменяется - вместо кнопки какая то анимация, либо пользовательская кнопка у которой другая логика работы, или что угодно, то это эти изменения будут только внутрение.
carrotoff
24.01.2012, 15:11
Расскажите, как Вы ловите клик по объекту, не подписываясь на MouseEvent?
Я и не говорил что не подписываться. Кнопку и все необходимые данные помещаем в класс-контейнер, в нем подписываемся на MouseEvent по нему шлем события к примеру ButtonClick с нужными данными, по сути MouseEvent получается инкапсулировано и извне видно только событие данного контейнера. Если потом внутренняя логика поменяется - вместо кнопки какая то анимация, либо пользовательская кнопка у которой другая логика работы, или что угодно, то это эти изменения будут только внутрение.
Какой-то странный подход. А чем MouseEvent то не угодил? Зачем дублировать события? Есть замечательный принцип: "Не следует множить сущее без необходимости (http://ru.wikipedia.org/wiki/%D0%91%D1%80%D0%B8%D1%82%D0%B2%D0%B0_%D0%9E%D0%BA%D0%BA%D0%B0%D0%BC%D0%B0)".
class MyClass extends Sprite{
public var param:int = 1;
public function MyClass(){
...
}
}
....
var btn:MyClass = new MyClass();
btn.addEVentListener(MouseEvent.CLICK, _onClick);
...
private function _onClick(e:MouseEvent):void{
trace((e.currentTarget as MyClass).param);
}
Stitch512
24.01.2012, 15:24
А еще есть понятие "уменьшение зависимостей".
http://www.flasher.ru/forum/showthread.php?t=174189
Вот к примеру. Если MyClass заменить на GameButton, то не факт что MouseEvent.CLICK будет приходить правильно, и тем более не сработает конструкция e.currentTarget as MyClass. А изменение графического контента - довольная частая ситуация. Но если вместо этого отсылать событие ButtonClick к примеру, то подмена кнопок на остальной код не повлияет, главное чтобы эта кнопка также отсылала нужное событие.
Я не хочу сказать что так прям всегда нужно делать, но при необходимости это имеет место быть.
carrotoff
24.01.2012, 15:32
Вот к примеру. Если MyClass заменить на GameButton, то не факт что MouseEvent.CLICK будет приходить правильно
С чего это вдруг?
Читаем доки:
currentTarget - Объект, активно обрабатывающий объект Event с помощью прослушивателя событий.
Кто подписался на событие, на того и получите ссылку. e.currentTarget as MyClass - частный случай
Stitch512
24.01.2012, 15:44
Событие то будет правильно приходить, но если поверх главного спрайта лежат другие (слои состояний кнопок) то событие придет им. Можно им поставить mouseEnabled = false, но это частный случай решения проблемы, в любом случае есть вероятность что currentTarget будет отличаться.
e.currentTarget as MyClass - частный случай
Вот я как раз и привел пример как сделать чтобы не было частных случаев.
И вообще, чем так не угодили кастомные события)
есть вероятность что currentTarget будет отличаться.Не было и нет таких вероятностей. Читайте справку.
Вот я как раз и привел пример как сделать чтобы не было частных случаев.Вы привели лишь другой пример частного случая. Причем автор топика спрашивал буквально, "как узнать по какой кнопке кликнули", и при чем тут кастомные события, посылаемые вверх контейнером этих кнопок, Вы так и не ответили. Вопрос был на уровне "узнать в контейнере". Может быть товарищу вовсе не нужно никуда выше никаких событий диспатчить. У него общий для всех ситуаций случай. У Вас - частное решение о том, что делать потом.
И вообще, чем так не угодили кастомные события)Всему есть свое место и время. Где-то они необходимы, где-то – удобны. Чаще всего они не нужны и ими пытаются разрулить ошибки архитектуры. Но к данному вопросу они просто не имеют никакого отношения.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.