2009-05-27 20 views
1

私は2つのキャンバスを定義したフレックスの小さなアプリケーションを持っています。そのうちの一つで、私は、コントロールを追加し、他の1は何かを描画するために使用され、何のコントロールが追加されない:フレックスのkeydownフレックス

<mx:Canvas x="0" y="80" width="100%" height="520%" id="Canvas1"/> 
<mx:Canvas x="0" y="0" width="100%" height="80" id="Canvas2"/> 

私は、アプリケーションに取り扱わのKeyDownイベントを追加しますが、私が上でマウスをクリックした後にのみトリガされます最初のキャンバス(コントロールが追加されたキャンバス)。それ以外の場合は、キーが押されてもイベントはトリガーされません。

私は、アプリケーション(this)、stage、canvasにkeydownハンドラを追加するために、2番目のキャンバスにフォーカスを設定することを試みました...残念ながら、問題なくkeydownをトリガする解決策は見つかりませんでした焦点はどこです。

答えて

0

最初の問題(KeyboardEventsが送出される前にマウスをクリックしなければならない)は、ブラウザがFlexアプリケーション自体にフォーカスを与えないためです。 HTMLラッパーのJavascriptを使用して、 "body"要素の "onLoad"イベントでFlexアプリケーションにプログラム的にフォーカスを与えることができます。私は特定のFirefoxでこの作品を知っていると私はそれがIEでも問題なく動作すると信じています。私は、関連するJavascriptコードを掘り下げようとします。

第2の問題点として、すべてのKeyboardEventをキャッチするためにApplication.applicationにイベントリスナーを追加しようとしましたか?

1

これは、Flex 4

<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" 
      name="MyApp" 
      width="480" height="480" 
      creationComplete="init();"> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 
<fx:Script> 
    <![CDATA[ 
     public function init():void 
     { 
      trace("init"); 
      this.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
     } 

     private function keyDown(event:KeyboardEvent):void 
     { 
      trace(event.charCode); 
     }  
</fx:Script></s:Application> 
のためであります