キーボードのフォーカス

少し苦労したのはキーボードフォーカスの扱いです。
こちらにも書いてある通り、アプリケーションのオブジェクトにイベントリスナーの関数をセットしてもちっとも呼ばれないため、イベント受信用の Sprite オブジェクト(m_canvas)を addChild() でつるし、そこにセットしてやる必要があるようです。
さらに、イベント受信用の Sprite の子供が表示領域全体を覆う Bitmap 1 枚だけなら問題ないのですが、今回の例のように TextField と Bitmap のように複数の子供をつるす場合はキーボードフォーカスの問題が出てきます。つまり、そのままでは表示されているテキスト部分や Bitmap をクリックしないとキーボードイベントが来てくれませんし、それら以外の部分をクリックすると途端に来なくなります。
これに対する解決として色々考えていたのですが、ヘルプを眺めていた所、stage.focus というプロパティにキーボードイベントを受ける表示オブジェクトを指定できるようです。そこで、MOUSE_DOWN のイベントリスナー関数の中で、以下のように書くことでとりあえず解決できました。クリックされた瞬間にフォーカスが外れるのを強引に奪う、というやり方なのでちょっと乱暴な気もしますが…。*1

private function onMouseDown(event:MouseEvent):void
{
	stage.focus = m_canvas; // focus が他へ移るのを防止
}

そして解決してからこちらのページにも同様の記述があることを発見…。orz

*1:子供のオブジェクトの方に「うちは focus を受け取りません」と設定することができれば、そっちの方が正しいような気がするんですが…いや、1ページ内に複数の swf が存在する時がダメですね…。結局強引にフォーカスを奪うしかないのか…。orz