在子类中处理MouseEvent.CLICK,MOUSE_DOWN

时间:2011-05-17 05:02:14

标签: actionscript-3 flex4 mouseevent uicomponents

我正在构建一个包含在Canvas容器中的按钮面板。为此,我创建了一个MyButton类,它是UIComponent的子类。 MyButton类有另外两个子类:MyRadioButtonMyMenuButton,它们在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 个答案:

答案 0 :(得分:2)

我设法抓住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
   }

免责声明:此代码对我有用,对我和我的应用程序需求都有好处。如果您不同意这种方式或有更好的建议方式,请在评论中进行。由于这个答案回答了我自己的问题而且这个编辑只是因为我被要求这样做而被添加,所以如果你不同意,请不要进行投票。

答案 1 :(得分:0)

像这样调用超类方法

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

答案 2 :(得分:0)

如果我正确地理解你,你只需要确保在你的覆盖处理程序中你通过调用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);

}

答案 3 :(得分:0)

我不是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 - 这是你在点击事件上运行的方法。您可能需要添加以下代码:

override protected handleClick(event:MouseEvent) : void
{
  // subclass specific handling for a click
}