gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

キーイベントの取得

発端は「Enterキーを押したら、あるボタンをClickしたのと同じ効果が欲しい」というご要望。
まぁよくありげなお話しです。


基本的には

application.addEventListener(KeyboardEvent.KEY_UP, keyHandler);

という感じで、KEY_UPのキーボードイベントにcallback関数を紐付けて、あとはそちらで

public function keyHandler(event:KeyboardEvent):void {
  if (13 == event.keyCode) {
    var ooo:MouseEvent = new MouseEvent(MouseEvent.CLICK);
    ボタンのインスタンス.dispatchEvent(ooo);
  }
}

という感じでEnterをClickイベントに紐付けて…ドはまり orz


えとですね。
普通。日本語入力システム(IMEとかそゆやつ)のイベントは、その後ろの(より親に近い)windowのイベントには流れないものなのですが。
が。
が。
Flashはそゆことないらしいのですが…Flexは、日本語入力システム中にも、クリアにキーイベントを取得します。
つまり。


1)「わたし」と入力
2)スペースキーを数回(多分1回)おして日本語変換候補
3)Enterキーをおして日本語変換確定
4)「は」と入力
5)Enterキーをおして日本語変換確定
6)Enterキーを押して「解答ボタンをクリック」と等価の効果を期待


という事をやりたい時に。6のEnterのkeyイベントを取得…するまえに、3と5のイベントを取得できてしまうです orz
しか〜も。

  trace ( e );

とかでイベントの差違をみるも…3,5と6の間には、な〜〜〜んの差違もございません orz


で、結論。
こう、実装します(ActionScriptベース。今度きちんと書くけど。ロジックをmxmlに書くのやめようよって、おいちゃんは思ってるので)。

<mx:TextInput id="ti" width="200" imeMode="JAPANESE_HIRAGANA"  />

として。

  ti.addEventListener(FlexEvent.ENTER , keyHandler2);

あんど

private function keyHandler2(e:FlexEvent):void {
  Alert.show(" event 2" );
  trace( "event 2");
  trace ( e );
}

ってな感じ。一応おいちゃん的に非推奨だけど

<mx:TextInput id="t2" enter="onEnter()" text="ほげほげ" />
<mx:Script><![CDATA[
import mx.controls.Alert;

private function onEnter():void {
  trace("test 1");
Alert.show("test 1");
}
]]></mx:Script>

って書式でも動きまふ。


Flex、癖強すぎ orz


&余談。


んと…上述、一発目書いた時。意味不明なエラーが出続けてました。
OS毎再起動した「だけ」であっさり動いたあたり…やっぱりこのIDE、かなり駄目な予感 orz
挙動が不安な時は。全部一式再起動すると、もしかしたら動く…かもしれません。
# エラーの場所指し示さないのにエラー出続けてたしなぁ orz


PS
http://d.hatena.ne.jp/gallu/20090628/p2
追記があるのでよろしければ読んでくんなまっしょ。