2009-07-31 8 views
2

Ich möchte Dinge arrangieren, so dass ich eine Kette von Tastaturereignishandlern in meiner Flex-Anwendung habe, von denen alle abgefragt werden, wenn Schlüsselereignisse auftreten. Wenn eine visuelle Komponente auf dem Bildschirm angezeigt wird, ist es im Grunde ein Kandidat für die Behandlung eines wichtigen Presseereignisses. So etwas wie dies (dies klar ist Pseudo-Code):Flex 3 Tastatur Ereignisbehandlung

<application handles_keys="F5, F6"> 
    <tabGroup> 
     <tab1 handles_keys="pgup, pgdn"> 
      <control handles_keys="0,1,2,3,4,5,6,7,8,9" /> 
     </tab1> 
     <tab2 handles_keys="pgup, left, right"/> 
    </tabGroup> 
</application> 

Ich habe eine Klasse geschrieben, die auf die wichtigsten Ereignisse, die Art und Weise reagieren, werden ich es will, so wie melde ich mich an einer oder mehr Instanzen dieser Klasse zu haben, die Ergebnisse, die ich will? Beachten Sie außerdem, dass in einigen Situationen diese Klasse Ereignisse empfangen sollte, die normalerweise von einer UI-Komponente gehandhabt werden. Die TAB-Taste ist das Hauptbeispiel. Ich habe ein paar Fälle, in denen ich möchte, dass mein Key-Down-Event-Handler ausgelöst wird, selbst wenn der Fokus auf einem Textfeld liegt.

Antwort

1

Der richtige Ansatz stellt sich heraus, dass es sich um einen globalen Tastatur-Event-Manager handelt, der beim Aufruf des creationComplete-Ereignisses der Anwendung als Down-Listener hinzugefügt wird. Dies löst dann Domänenereignisse für jeden Tastendruck oder eine Kombination davon aus. Leider hat das Filtern pro Bauteilmodell nicht funktioniert.

Ich werde diese App auf das Cairngorm-Framework portieren, das sollte wirklich gut funktionieren, sobald ich fertig bin.

2

Die Art, wie Sie Ihren Pseudocode-Setup jetzt haben, müssten Sie alle verschiedenen Container Unterklasse und fügen Sie eine handles_key-Eigenschaft zu jedem. Sie können die Funktionalität in eine separate Klasse wie folgt externalisieren wollen:

<KeyHandler target="{tab1}" handlesKeys="pgup,left,right"/> 

Was tatsächlich die Ereignisse zu kontrollieren, werden Sie einen KeyboardEvent.KEY_DOWN Zuhörer auf die hinzufügen müssen UIComponent Sie wollen, zu hören. Sie müssen auch das useCapture Argument von addEventListener() auf true setzen. Dadurch können Sie das Ereignis erfassen und verhindern, dass das Ereignis nicht auf das Objekt trifft und aufblubbert.

target.addEventListener(KeyboardEvent.KEY_DOWN, target_onKeyDown, true); 

In Ihrem target_onKeyDown Fall überprüfen, um zu sehen, ob Sie eine Übereinstimmung für einen Ihren Schlüssel haben Sie behandeln möchten, und wenn es eine Übereinstimmung gibt, rufen event.stopImmediatePropagation() oder event.preventDefault() je nachdem, was Sie tun müssen.

Die Flex 3 Language Reference gibt eine gute Erklärung von Ereignispropagierung und Tastaturereignisse:

http://livedocs.adobe.com/flex/3/langref/flash/events/Event.html

1
  1. wenn das angezeigte Objekt wird dann zu screenen starten Bühne Tastaturereignisse hören

  2. Wenn das Objekt vom Bildschirm entfernt wurde, entfernen Sie den Tastaturereignis-Listener

  3. auf Tastaturereignisse filtern Sie die Ereignisse, die Sie brauchen :)

Der Code für eine Canvas-Klasse Sie sollte wie folgt aussehen müssen:

class MyCanvas extends Canvas 
{ 

    public function MyCanvas(){ 
     super(); 
    } 

    override protected function createChildren():void{ 
     super.createChildren(); 
     this.systemManager.stage.addEventListener(KeyboardEvent.KeyUp, onKeyUpHandler); 
    } 

    private function onKeyUpHandler(e:KeyboardEvent):void{ 
     // handle your code 

     switch(e.charCode){ 
      case Keyboard.1: 
      case Keyboard.2: 
      case Keyboard.3: 
      case Keyboard.4: 
      case Keyboard.5: 
      case Keyboard.6: 
      case Keyboard.7: 
      case Keyboard.8: 
      case Keyboard.9:{ 
        // do my stuff 
        break; 
       } 
      case Keyboard.F1:{ 
        // do other stuff 
        break; 
       } 

      } 

     } 

    } 

    public function destroy():void{ 
     //don't forget to remove listeners for stupid flash garbage collector 
     this.systemManager.stage.removeEventListener(KeyboardEvent.KeyUp, onKeyUpHandler); 
    } 

} 

Ignorieren Sie miss-Zauber: DI schrieb den Code aus meine Meinung :))