Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не понимаю как работает EventDispatcher (http://www.flasher.ru/forum/showthread.php?t=144763)

kosheev_me 20.09.2010 19:07

Не понимаю как работает EventDispatcher
 
Добрый день суток!

Вопрос скорее всего посящен работе событий в ActionScript 3.0.

Исходные данные:

Использую DataGrid с переопределенным CellRenderer для одного из столбцов:

Код AS3:

// таблица со списком сотрудников
var _listEmployees:DataGrid;
 
var column:DataGridColumn;
 
_listEmployees = new DataGrid();
 
column = new DataGridColumn("fio");
column.headerText = "Фамилия Имя Отчетсво";
column.cellRenderer = FIOCellRenderer;
column.minWidth = 224;
_listEmployees.addColumn(column);
 
_listEmployees.rowHeight = 30;
 
addEventListener(EventsEnum.EVENT_SHOW_POPUP, onShowPopup);

Класс FIOCellRenderer выглядит следующим образом:
Код AS3:

public class FIOCellRenderer extends MovieClip implements ICellRenderer
{
        private var _listData:ListData;
        private var _data:Object;
        private var _selected:Boolean;
        private var _mouseState:String;
        private var _btnPopup:SimpleButton;
 
        public function FIOCellRenderer()
        {
                _btnPopup = new SimpleButton();
                _btnPopup.addEventListener(MouseEvent.MOUSE_DOWN, onPopup);
        }
 
        public function get data():Object
        {
                return _data;
        }
 
        public function set data(param0:Object):void
        {
                _data = param0;
        }
 
        public function get listData():ListData
        {
                return _listData;
        }
 
        public function set listData(param0:ListData):void
        {
                _listData = param0
        }
 
        public function get selected():Boolean
        {
                return _selected;
        }
 
        public function set selected(param0:Boolean):void
        {
                _selected = param0;
        }
 
        public function setMouseState(param0:String):void
        {
                _mouseState = param0;
        }
 
        public function setSize(w:Number, h:Number):void
        {
                ...
        }
 
        public function setStyle(style:String, value:Object):void
        {
                ...
        }
 
        protected function onPopup(e:MouseEvent):void
        {
                dispatchEvent(new MyEvent(EventsEnum.EVENT_SHOW_POPUP, true, false, null, new Point(e.stageX, e.stageY)));
        }
}

Обработчик события EventsEnum.EVENT_SHOW_POPUP вот такой:

Код AS3:

protected function onShowPopup(e:MyEvent):voi
{
        _menuModal = new Sprite();
        _menuModal.graphics.beginFill(0xFFFFFF, 0.5);
        _menuModal.graphics.drawRect(0, 0, Constants.STAGE_WIDTH, Constants.STAGE_HEIGHT);
        _menuModal.graphics.endFill();
        addChild(_menuModal)
}

Этот обработчки создает полупрозрачный Sprite и выводит его поверх всех (в том числе _listEmployees) элементов.

Я щелкаю по _btnPopup, вызывается обработчик onShowPopup. А теперь вопрос:
Если в обработчкике не стоит addChild(_menuModal), то строчка в DataGrid выделяется, а _listEmployees.selectedItem возвращает Object, хранящуюся в этой строке.
Если же строчка addChild(_menuModal) есть, то соответсвующая строка не выделяеся и _listEmployees.selectedItem возвращает null или возвращает элемент,
который был выбран до щелчка.
Почему так происходит?

Korben 20.09.2010 21:08

попробуйте
addEventListener(EventsEnum.EVENT_SHOW_POPUP, onShowPopup, true);

kosheev_me 20.09.2010 23:15

Цитата:

попробуйте
addEventListener(EventsEnum.EVENT_SHOW_POPUP, onShowPopup, true);
Увы но не помогло

Добавлено через 19 часов 35 минут
Ну что ж... Разобрался сам :)
Проблема возникает вот в какой строке:
Код AS3:

_btnPopup.addEventListener(MouseEvent.MOUSE_DOWN, onPopup);

Дело в том, что DataGrid выделяет некоторую строку при событии MouseEvent.CLICK. А такого события в описанной ситуации в DataGrid просто не приходит.
В DataGrid приходит событие MouseEvent.MOUSE_DOWN, а событие MouseEvent.MOUSE_UP приходит уже в в то самое полупрозрачное окно.


Часовой пояс GMT +4, время: 20:12.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.