フォーカス設定を扱う

ActionScript の Event クラスからフォーカスを扱うには FocusEvent クラスを利用します。しかし、このイベントは実装されていないクラスも多く、すぐに使う事は難しいケースも存在します。
そこで、このイベントが実装されていないコンポーネントにフォーカス設定を実装していきます。

実装

FocusEvent を扱うには IFocusManagerComponent インターフェースを実装します。ここでは、 Canvas を拡張した MyCanvas クラスをサンプルとして扱います。

package jp.ne.sakura.hl2
{
  import mx.containers.*;
  import mx.managers.IFocusManagerComponent;
  import flash.events.*;

  public class MyCanvas extends Canvas implements IFocusManagerComponent
  {
    public function MyCanvas() {
      // フォーカスの可否を設定
      super.focusEnabled = true;

      // TAB キーとマウス操作によるフォーカス取得を可能に
      super.tabEnabled = true;
      super.mouseFocusEnabled = true;
    }

    // 親クラスの focusInHandler をオーバーライド
    override protected function focusInHandler(e:FocusEvent):void {
      super.focusInHandler(e);

      // ここを記述しておかないとマウスクリックでフォーカスが表示されない
      super.focusManager.showFocus();
      /* フォーカスを表示する必要はないのであれば、こう書けばいい
         super.focusManager.hideFocus(); */
    }
  }
}

もちろん、親クラスのハンドラをオーバーライドせずに自分で定義する事もできます。この場合 focusInHandler という名前は使えないため、別の名前でメソッドを定義します。

this.addEventListener(FocusEvent.FOCUS_IN, fInHandler);

private function fInHandler(e:FocusEvent):void {
  // 何らかの動作
}

後は適当にこれを呼び出して TAB キーやマウスで操作してください。上の実装は本当に最低限のことしか行っていないため、他に知りたい事があれば下のリンクをどうぞ。