WedX - журнал о программировании и компьютерных науках

Обработка MouseEvent.CLICK, MOUSE_DOWN в подклассах

Я создаю панель кнопок, заключенных в контейнер Canvas. Для этой цели я создал класс MyButton, который является подклассом UIComponent. Класс MyButton имеет 2 других подкласса: MyRadioButton и MyMenuButton, которые имеют другое поведение для MouseEvent.MOUSE_DOWN. MyMenuButtonсоздает и показывает меню, которое я строю из XML, и оно строится нормально.

Я добавляю слушателей в суперкласс следующим образом:

this.addEventListener(MouseEvent.CLICK, handleClick);
this.addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
this.addEventListener(MouseEvent.MOUSE_UP, handleMouse);

Это делается на этапе создания.

В своих подклассах я переопределяю обработчик handleMouse.

override protected handleMouse(event:MouseEvent) : void
{
  // subclass specific handling
}

Эти объекты кнопки добавляются в контейнер холста следующим образом:

в классе MyButtonsContainer.as:

this.rowChildren.addChild(button);

Эти кнопки рисуются идеально и на своем месте. Проблема в поведении: событие не приходит в обработчик handleClick суперкласса. И вот собственно вопрос - почему так может быть? заранее спасибо

EDIT: похоже, что MOUSE_DOWN и MOUSE_UP мешают событию CLICK. Когда я удаляю их слушателей, я получаю обработчик кликов. Как заставить их жить вместе?


  • Вы определяете обработчик в дочерних классах, покажите некоторый относительный дочерний код. 17.05.2011
  • Загляните внутрь вопроса: в моих подклассах я переопределяю событие handleMouse... 17.05.2011
  • В вашем общем коде переопределяется функция-обработчик с именем handleMouse, которая будет запускаться при родительском событии, т. е. MouseEvent.MOUSE_DOWN и MouseEvent.MOUSE_UP. У вас есть обработчик событий в подклассах? Чисто? 17.05.2011

Ответы:


1

Мне удалось поймать событие CLICK как разницу во времени между MOUSE_DOWN и MOUSE_UP.

РЕДАКТИРОВАТЬ: короткое/длинное объяснение: по какой-то причине мои слушатели событий MOUSE_DOWN/MOUSE_UP мешали MouseEvent.CLICK. Кто-то предложил мне отказаться от прослушивания MouseEvent.CLICK и вместо этого запустить таймер в MouseEvent.MOUSE_DOWN и снова проверить таймер в MouseEvent.MOUSE_UP. Если разница меньше 0,1 (можно поставить другой порог), то это действительно был щелчок.

Теперь пример кода:

public class MyButton extends UIComponent
{
   ...
   private var _clickTime : Number = 0.;

   public function void MyButton()
   {
       super();
       addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
       addEventListener(MouseEvent.MOUSE_UP, handleMouse);
   }

   protected function checkForClick(event:MouseEvent) : Boolean
   {
      var down : Boolean = event.type == MouseEvent.MOUSE_DOWN;

      if (down)
         _clickTime = getTimer();
      else {
          var diff : Number  = getTimer() - _clickTime;
          if (diff/1000. < 1.) {
              handleClick();
              return true;
          }
      }
      return false;
   }

   protected function handleClick(event:MouseEvent) : void
   {
       // handle the click here
   }

   protected function handleMouse(event:MouseEvent) : void
   {
       checkForClick(event);
       ... 
       // take care of your button graphic state
   }

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: этот код работает для меня и подходит для меня и потребностей моего приложения. Если вы не согласны с этим способом или предлагаете лучший способ, пожалуйста, сделайте это в комментариях. Поскольку этот ответ отвечает на мой собственный вопрос, и этот EDIT был добавлен только потому, что меня попросили сделать это, пожалуйста, не понижайте его, если вы с ним не согласны.

23.05.2011
  • Этот ответ трудно понять людям, просматривающим уже заданные вопросы и ответы на них - не могли бы вы уточнить подробнее ..? 23.05.2011
  • Понижение означает, что этот ответ бесполезен. На данный момент, если кто-то столкнется с этим при попытке решить ту же проблему, это не будет ему полезно. Проголосую, как только вы это исправите: P 23.05.2011
  • Сделал это. Дайте мне знать, если это поможет вам 23.05.2011

  • 2

    вызовите метод суперкласса так

    override protected handleMouse(event:MouseEvent) : void
    {
      super.handleMouse(event);
      // subclass specific handling
    }
    
    17.05.2011

    3

    Если я правильно вас понимаю, вам просто нужно убедиться, что в ваших переопределенных обработчиках вы заканчиваете каждый вызовом super -

    override protected handleMouse(event:MouseEvent):void {
    // my logic here for the subclass
    trace("blah blah blah");
    
    //now redispatch up to the superclass.
    super.handleMouse(event);
    
    }
    
    17.05.2011
  • На самом деле проблема в том, что я не переопределяю обработчик события CLICK в подклассах и он туда не приходит. Вот в чем вопрос. Почему дело доходит до обработчика MOUSE_DOWN/UP и не доходит до обработчика события CLICK? 17.05.2011

  • 4

    Я не уверен на 100%, о чем вы спрашиваете, но я бы переопределил такие действия щелчка.

    Базовый класс:

    public class MyButton extends UIComponent
    {
        /**
         * Constructor
         */
        public function MyButton()
        {
            // listeners
            addEventListener(MouseEvent.CLICK, _click);
            // ...other listeners
        }
    
        /**
         * Called on dispatch of MouseEvent.CLICK
         */
        private function _click(e:MouseEvent):void
        {
            doClick();
        }
    
        /**
         * Override this method and fill with actions to
         * do when this is clicked
         */
        protected function doClick():void
        {
            trace("base class was clicked");
        }
    }
    

    И расширяющий класс:

    public class MyOtherButton extends MyButton
    {
        /**
         * Override doClick
         */
        override protected function doClick():void
        {
            super.doClick();
            trace("extending class was clicked");
        }
    }
    

    После внимательного изучения вашего кода:

    Вы добавили два разных слушателя к одной функции вместо одной, разве они не должны иметь отдельные функции, поскольку они вызываются контрастными событиями?

    this.addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
    this.addEventListener(MouseEvent.MOUSE_UP, handleMouse);
    

    Кроме того, похоже, что вы ожидаете, что handleMouse будет запущена событием щелчка, судя по приведенному ниже коду, что не так.

    override protected handleMouse(event:MouseEvent) : void
    {
      // subclass specific handling
    }
    

    Либо так, либо вы забываете также переопределить handleClick - это метод, который вы используете для события click. Возможно, вам нужно добавить этот код:

    override protected handleClick(event:MouseEvent) : void
    {
      // subclass specific handling for a click
    }
    
    17.05.2011
  • пробовал, почему-то не работает. Как будто он вообще не получает событие CLICK 17.05.2011
  • Возможно, что-то находится над целью, например, прозрачный объект? 17.05.2011
  • НЕТ, но я обнаружил, что когда я удаляю MOUSE_DOWN и MOUSE_UP, щелчок работает. Так что, наверное, они как-то мешают. Как заставить их работать вместе? 17.05.2011
  • На самом деле одну секунду, позвольте мне добавить к моему ответу. 17.05.2011
  • Он не попадает ни в handleClick суперкласса, ни в подкласс. Как только я удаляю слушателей MOUSE_DOWN/MOUSE_UP, дело доходит до handleClick. Правильно, это тот же обработчик, который обрабатывает MOUSE_DOWN/UP, но я запрашиваю его, но спрашиваю о event.type, и графический интерфейс работает нормально. 17.05.2011
  • Пожав плечами, все, о чем я могу думать, это то, что где-то в вашем наследстве вы сделали что-то не так. 17.05.2011
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]