![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2006
Сообщений: 28
|
мне хотелось бы создать класс типа radiobutton, кнопки с двумя возможными положениями "вкл/выкл" каждая и только одна кнопка может быть включена одновременно, т.е. одну включаешь - остальные выключаются
и хотелось бы заложить эту функциональность внутрь класса, чтобы люди, использующие этот класс, только создавали instances и больше от них ничего не требовалось, т.е. весь внешний код сводился бы к я пытаюсь использовать диспетчер событий внутри класса, чтобы после клика на instance запускалось событие и его бы слушали все instances этого класса. однако запущенное событие не ловится. подскажите, пожалуйста, что я делаю не так и как это лучше сделать? спасибо package sample{
import flash.events.EventDispatcher;
import flash.events.MouseEvent;
import flash.display.MovieClip;
import flash.events.Event;
public class radioButtons extends MovieClip {
var dispatcher:EventDispatcher = new EventDispatcher();
public function radioButtons() {
this.buttonMode = true;
this.addEventListener(MouseEvent.CLICK, butClick);
this.addEventListener("clicked", capture);
}
public function butClick(e:MouseEvent) {
dispatcher.dispatchEvent(new Event("clicked"));
trace(e.currentTarget + " has been clicked");
}
function capture(e:Event) {
trace(e.currentTarget + " has received a click notification");
}
}
}
|
|
|||||
|
Регистрация: Jul 2007
Сообщений: 30
|
выпускаешь евент dispatcher'ом, а ловишь MovieClip'ом
Добавлено через 14 минут Накидал на коленке, компилировать не пробовал: package { import flash.display.MovieClip; import flash.events.EventDispatcher; import flash.events.Event; import flash.events.MouseEvent; public class myRadio extends MovieClip { public static var dispatcher:EventDispatcher; public static var instances:Array; public function myRadio() { myRadio.checkInstance(); myRadio.instances.push(this); addEventListener(MouseEvent.CLICK, onMyClick); addEventListener("clicked", onSomeClick); } private function onMyClick(e:MouseEvent):void { myRadio.dispatcher.dispatchEvent(new Event("clicked")); } private function onSomeClick(e:Event):void { // update me } public static function checkInstance():void { if(myRadio.dispatcher == null) { dispatcher = new EventDispatcher(); dispatcher.addEventListener("clicked", sendClicked); instances = new Array(); } } private static function sendClicked(e:Event):void { for each(var instance:MovieClip in instances) { instance.dispatchEvent(e); } } } } Последний раз редактировалось ins_nsk; 05.07.2010 в 15:54. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А если в форме нужно более одного набора радиокнопок? Не логичнее ли всетаки иметь класс НаборРадиоКнопок ?
И с каких пор названия классов стали писать с маленькой буквы?))
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Jun 2006
Сообщений: 28
|
Цитата:
Добавлено через 8 минут спасибо! в списке вещей, которых я не понимаю, на первом месте вот это: использование имени класса внутри описания класса, это не то же самое что ? |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Класс и его Экземпляр (instance) - две большие разницы.
Конкретно метод checkInstance объявлен как static, т.е. является методом Класса, а не отдельного Экземпляра. ins_nsk предлагает использовать собственные методы Класса вместо создания отдельного экземпляра класса-менеджера (поэтому мое замечание выше, что такой менеджер будет только один, невозможно сделать несколько наборов). У него Класс хранит в своем собственном массиве ссылки на все создаваемые Экземпляры кнопок, и управляет их связанным поведением.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 05.07.2010 в 18:26. |
|
|||||
|
Регистрация: Jul 2007
Сообщений: 30
|
Wolsh, ну почему же один, нужно просто немного расширить функциональность.
var myElement1:myRadio = new myRadio("group1"); var myElement2:myRadio = new myRadio("group1"); var myElement3:myRadio = new myRadio("group1"); var myElement4:myRadio = new myRadio("group2"); var myElement5:myRadio = new myRadio("group2"); var myElement6:myRadio = new myRadio("group2"); Статический массив экземпляров сделать ассоциативным массивом массивов. |
|
|||||
|
Регистрация: Jun 2010
Адрес: Беларусь, Гродно
Сообщений: 58
|
Могу посоветовать очень хорошую СДК, там уже написаны радиобаттоны. Называется она Flex
![]() |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Хех, ну опосля то можно много чего добавить, например создание групп по xml)))
Претензия была к данному коленочному классу (а точнее к самому подходу "кнопки все решают сами"). И у меня еще масса вопросов есть. 1. Не хватает обработки удаления кнопки. 2. Не лучше ли при клике по кнопке вызывать напрямую некий метод Класса (передавая ему ссылку на кликнутую кнопку), который пробежится по массиву и переведет остальные кнопки в нужное состояние? В Вашем варианте, как я понял, кликнутая кнопка также получает событие "кликед", и соотв. переключится в ненажатое состояние))) Стоит ли городить в каждой кнопке огороды проверок и тем более изобретать отдельное событие...
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 05.07.2010 в 19:12. |
|
|||||
|
Регистрация: Jun 2006
Сообщений: 28
|
совсем забыл про эти статические переменные, очень полезная в хозяйстве вещь
по здравом размышлении диспетчер оказался лишним, вот что получилось в результате: // file test.as package { import flash.display.MovieClip; import flash.events.Event; import radioButton; public class test extends MovieClip { public function test() { addEventListener(Event.ADDED_TO_STAGE,init); } private function init(event:Event):void { removeEventListener(Event.ADDED_TO_STAGE,init); var rb1:radioButton = new radioButton(50); var rb2:radioButton = new radioButton(100); var rb3:radioButton = new radioButton(150); addChild(rb1); addChild(rb2); addChild(rb3); } } } // file radioButton.as package { import flash.display.MovieClip; import flash.events.MouseEvent; public class radioButton extends MovieClip { private static var num:Number = 0; private static var instances:Array = new Array(); public function radioButton(x:Number) { instances.push(this); num++; name = "button" + String(num); graphics.beginFill(0xff0000, 1); graphics.drawRect(0,0,30,30); graphics.endFill(); this.x = x; this.buttonMode = true; this.addEventListener(MouseEvent.CLICK, mouseClick); } private function mouseClick(e:MouseEvent) { trace("\n" + e.currentTarget.name + " has been clicked"); for (var i in instances) { if (instances[i] != e.currentTarget) { instances[i].switchIt(); } } } private function switchIt() { trace(this.name + " has been told to switch"); } } } // output button1 has been clicked button2 has been told to switch button3 has been told to switch button2 has been clicked button1 has been told to switch button3 has been told to switch button3 has been clicked button1 has been told to switch button2 has been told to switch |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:55. |
|
|
« Предыдущая тема | Следующая тема » |
|
|