発端は「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
に追記があるのでよろしければ読んでくんなまっしょ。