1

何らかの理由で、私が定義したイベント リスナーはイベントをまったく受信していないように見えます。以下は、私が使用している MXML コードの非常に短い説明です。

WindowedApplication
    VBox (root box)
        MenuBar
        TabNavigator
            VBox (first tab)
                Canvas
            VBox (second tab)

KEY_DOWN イベントのリスナーを WindowedApplication またはルート VBox に追加すると、ハンドラーはイベントを問題なく受け取ります。しかし、キャンバスまたは最初のタブ VBox にリスナーを追加すると、ハンドラーは何も受信しないようです。(ここでは、キャンバス領域をクリックするだけでフォーカスが得られると仮定していますが、正しいですか?)

私は Flex を使い始めたばかりなので、どこかでばかげた初心者の間違いを犯したことを願っています。どんな助けにもとても感謝しています。ありがとう!

4

2 に答える 2

1

Ryan に同意します。一般的にキーボード イベントを処理するときに、リスナーをターゲット フェーズまたはバブリング フェーズではなく、イベントのキャプチャフェーズに接続することが役立つことがあると思うことがあると付け加えておきます(3 番目の引数 false に注意してください)。デフォルトで):

stage.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown, true);

たとえば、矢印キーが何らかの方法でコア アクションを制御するカジュアル ゲーム (テトリスなど) を考えてみると、キャプチャ フェーズ中にイベントに応答することには、明確な利点があります。ドキュメントから:

キャプチャ段階では、Flex は表示リスト内のイベントの祖先を調べて、イベントのリスナーとして登録されているものを確認します。Flex はルートの祖先から始まり、表示リストをターゲットの直接の祖先まで続けます。ほとんどの場合、ルートの祖先は Stage、 SystemManager 、 Application オブジェクトの順です。

したがって、この場合、ステージのリスナーが他の誰よりも先に最初に通知を受け取り、それに応じて応答できることを確認できます。よりアプリケーション固有のカスタム イベント:

private function handleKeyDown(event:KeyboardEvent):void
{
    if (event.keyCode == Keyboard.LEFT)
    {
        dispatchEvent(new Event("rotateLeft"));
    }
    else if (event.keyCode == Keyboard.RIGHT)
    {
        dispatchEvent(new Event("rotateRight"));
    }
    else
    {
        event.stopPropagation();
    }
}   

...そして、アプリ全体にキーボード リスナーが集中するのを防ぎます。

イベント伝播フェーズについては、こちらで詳しく説明しています。こちらもチェックしてください - 知っておく価値のあるすばらしい情報があります。

于 2009-02-06T19:27:43.980 に答える