2009-06-11 9 views
3

私が回避しようとしているのは、ユーザーがボタンをクリックした後、ボタンがフォーカスを保持した後、ユーザーがスペースキーを押すと、ボタンが再び発生します。だから私は、フォーカスをどこかに設定するか、ボタンがスペースキーを無視するようにして解決できると思った。私はボタンに次のkeyDownイベントリスナを追加しようとしましたが、うまくいかなかった。ボタンがフォーカスを持っている場合、スペースキーにボタンが発射されないようにする方法は?

private function btn_keyDown(event:KeyboardEvent):void { 
    // try to ignore spaces, i.e. don't click on SPACE when it has focus 
    if (event.keyCode == Keyboard.SPACE) { 
    } 
} 

私はボタンがクリックされたときに呼ばれています関数の最後に、次の手順を実行してフォーカスを変更しようとした:

stage.focus = parent; 

が、それはどちらか動作しませんでした。内部ハンドラに

答えて

4

カスタムボタンコンポーネントを作成し、keyDownHandlerをオーバーライドする必要があります。ただし、停止するボタンを選択する場合は、コードに条件を追加する必要があります。これは、それがどのように見えるかです:

package Sandbox 
{ 
    import mx.controls.Button; 
    import flash.events.KeyboardEvent; 

    public class KeyButton extends Button 
    { 
     public function KeyButton() 
     { 
      super(); 
     } 

     protected override function keyDownHandler(e : KeyboardEvent) : void { 
      if (e.keyCode == 32) { // Spacebar 
       return; 
      } 
      else if (e.keyCode == 67) { // Letter C 
       this.parentApplication.setStyle ("backgroundColor", "#00aa00"); 
      } 

      super.keyDownHandler (e); 
     } 

    } 
} 

この利点は、入力のような他のキーはまだ、動作します、またはたとえば、あなたがの色を変更したい、場合は、別のキーのためのより多くの条件文を追加することができるということですボタンを押した場合はCなどを押します。

私たちがいる間は、KeyboardEvent.keyCodeとcharCodeに違いがあります。 keyCodeは物理キーボード上のキーのIDです。つまり、小文字のcと大文字のCは同じです(keyCode == 67)。一方、charCodeはASCIIテーブルの文字のアドレスなので、cとCは異なります(Cは67、cは99)。要するに、keyCodeは大文字小文字を区別しません。

ああ、はい。また、キーのキーとコード(バックスペースのような任意のものを含む)をチェックする必要がある場合は、pageをチェックしてください。

これを説明するためにapplicationも作成しました。これは標準のFlex Builderプロジェクトですが、ソースがない場合はsrcフォルダにあります。アプリケーションを起動し、ボタンをクリックしてフォーカスを合わせます。ボタンのクリックイベントのおかげで、ボタンの上にテキストが表示されるはずです。フォーカスがある間、クリックイベントを発生させ、より多くのテキストを印刷する必要がありますが、何も起こりませんスペースバーを押してください!次に、cキーを押してアプリケーションの背景色を変更します。きちんとした、ええ?

ソースhereがあります。

1

を増やしてみてくださいevent.stopPropogation()

0

「場合」クリックハンドラは、ボタンタグにバインドされたすべてのkeyUpイベントハンドラの前に解雇されたので、それをキャンセルする方法はありません。あなたが望むことができる方法の1つは、イベントがスペースボタンを押すことによって引き起こされたものであっても、クリックから生じたものであってもフラグを設定することです。

private var spacePressed:Boolean = false; 

private function onKeyDown(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.SPACE) { 
     spacePressed = true; 
    } 
} 

private function onKeyUp(event:KeyboardEvent):void { 
    if (event.keyCode == Keyboard.SPACE) { 
     spacePressed = false; 
    } 
} 

private function doSomething():void { 
    if (spacePressed) 
     return; 
    // Normal handling... 
} 

 

<mx:Button label="Button" 
    keyDown="onKeyDown(event);" 
    keyUp="onKeyUp(event);" 
    click="doSomething();"/> 
0

スペースボタンはそう単純に空の体でそれをオーバーライドして、それが問題を解決します、ボタンのkeyDownHandlerの内側に処理されます。このように:

package test 
{ 
import mx.controls.Button; 
import flash.events.KeyboardEvent; 

public class NoSpaceButton extends Button 
{ 
    public function NoSpaceButton() 
    { 
     super(); 
    } 

    override protected function keyDownHandler(event:KeyboardEvent):void 
    { 
    } 

} 
} 
7

私は同じ問題を抱えていたが、カスタムボタンのクラスや変数バレーボールを含まない、より良い解決策を見つけました。

ボタンがタブオーダーの一部であることを気にしない場合は、単に「focusEnabled」プロパティをFALSEに設定すると、スペースバー(およびボタンを入力)がボタンのクリックイベントを発生させないようになります。

関連する問題