Обрабатывать MouseEvent.CLICK, MOUSE_DOWN в подклассах - PullRequest
0 голосов
/ 17 мая 2011

Я строю панель кнопок, которые заключены в контейнер 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 суперкласса.И это вопрос на самом деле - почему это может быть?Заранее спасибо

РЕДАКТИРОВАТЬ: Похоже, что MOUSE_DOWN и MOUSE_UP вмешиваются в событие CLICK.Когда я удаляю их слушателей, я нажимаю на обработчик. Как заставить их жить вместе?

Ответы [ 4 ]

2 голосов
/ 23 мая 2011

Мне удалось поймать событие 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
   }

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

0 голосов
/ 17 мая 2011

Если я вас правильно понимаю, вам просто нужно убедиться, что в ваших переопределенных обработчиках вы заканчиваете каждый вызовом 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);

}
0 голосов
/ 17 мая 2011

Я не на 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 будет запущен событием click, судя по приведенному ниже коду, а это не так.

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

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

override protected handleClick(event:MouseEvent) : void
{
  // subclass specific handling for a click
}
0 голосов
/ 17 мая 2011

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

override protected handleMouse(event:MouseEvent) : void
{
  super.handleMouse(event);
  // subclass specific handling
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...