0

Canvasコンテナで囲まれたボタンのパネルを作成しています。この目的のためにMyButton、UIComponentのサブクラスであるクラスを作成しました。MyButtonクラスには他に2つのサブクラスがあります:MyRadioButtonMyMenuButton、は、に対して別の動作をしMouseEvent.MOUSE_DOWNます。MyMenuButtonXMLから構築したメニューを作成して表示し、正常に構築します。

次のようにスーパークラスにリスナーを追加します。

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

4 に答える 4

2

CLICKのタイミング差でなんとかイベントをキャッチできました。MOUSE_DOWNMOUSE_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は私がそうするように求められたという理由だけで追加されたので、同意しない場合は反対票を投じないでください。

于 2011-05-23T07:14:04.063 に答える
0

そのようにスーパークラスメソッドを呼び出す

override protected handleMouse(event:MouseEvent) : void
{
  super.handleMouse(event);
  // subclass specific handling
}
于 2011-05-17T05:06:52.933 に答える
0

私があなたを正しく理解しているなら、あなたはあなたのオーバーライドされたハンドラーであなたがスーパーへの呼び出しでそれぞれを終了することを確認する必要があります-

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);

}
于 2011-05-17T05:07:50.887 に答える
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");
    }
}

コードを綿密に調べた後:

1つの関数に2つの異なるリスナーを追加しましたが、これらは対照的なイベントによって呼び出されるため、別々の関数を持つべきではありませんか?

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
}
于 2011-05-17T05:22:25.200 に答える