ボタンにフォーカスがある時、スペースキー(IMEオフのとき限定)を押下した際に、ボタンのクリックイベントが呼ばれます。
これをEnterキーでも押下できるようにしたいと考え、Buttonクラスを拡張して以下のCstmButtonクラスを作成してみました。
CstmButton.asファイル
package { import flash.events.KeyboardEvent; import flash.ui.Keyboard; import mx.controls.Button; public class CstmButton extends Button { public function CstmButton() { super(); } override protected function keyDownHandler(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) event.keyCode = Keyboard.SPACE; super.keyDownHandler(event); } override protected function keyUpHandler(event:KeyboardEvent):void { if (event.keyCode == Keyboard.ENTER) event.keyCode = Keyboard.SPACE; super.keyUpHandler(event); } } }
ソースコードを読んでもらえばわかるとは思いますが、この方法はかなりお手軽な方法(手抜き)です。
CstmButtonクラスの中身は、キーが押されたときに呼ばれているクラス(KeyboardEvent)内で、Enterキーが押されたときに呼ばれるメソッド(keyDownHandler)、離されたときに呼ばれるメソッド(keyUpHandler)をそれぞれオーバーライドして、パラメータで渡されたイベントクラス内の押されたキーの情報(keyCode)を、EnterキーからSpaceキーのKeyCodeに置き換えてからsuper()を呼んでます。
CstmButtonクラスの継承元であるButtonクラスのkeyDownHandlerメソッド、keyUpHandlerメソッドでは、押されたキー(keyCode)をみてSpaceキーの場合に処理が動いているので、Enterキー押下時にSpaceキーに置き換えることで、Enterキーでもボタンが押せるようになります。
以下、上記クラスを検証するためのサンプルソースです。
.mxmlファイル
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:local="*" horizontalAlign="left"> <mx:Script> <[CDATA[ import mx.controls.Alert; private function checkClicked():void{ Alert.show("反応!"); } ]]> </mx:Script> <local:CstmButton label="カスタム" click="checkClicked()"/> <mx:Button label="普通" click="checkClicked()"/> </mx:Application>
※ サンプルソースでは、ボタンが押されたという反応を確認するため、clickイベントを追加してます