Глобальный eventListener, когда фокус внутри texiInput - PullRequest
2 голосов
/ 07 апреля 2011

Я пытаюсь создать глобальный eventListener. Все работает нормально, KeyboardEvent.KEY_DOWN срабатывает все время .. кроме случаев, когда textInput имеет фокус.

Вот как я прикрепляю слушателя:

FlexGlobals.topLevelApplication.systemManager.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);

Я пробовал оба (использовать захват и без него). Чего мне не хватает?

Спасибо за ваше время:)

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Во-первых, я не знаю, почему вы используете systemManager в качестве объекта прослушивателя, поскольку он не является частью списка отображения, поэтому он не может получать всплывающие события.Во-вторых, использование FlexGlobals не лучший способ сделать что-либо (лично, кроме использования его для всплывающих окон, я не вижу много причин, почему вы должны его использовать).

Если вы хотите слушатьглобальное событие, просто поставить его на сцену.У каждого компонента представления есть свойство stage, которое указывает на основную стадию вашего flex-приложения.Попробуйте это:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
0 голосов
/ 07 апреля 2011

Хм ... Я не очень понимаю, в чем проблема.

Вот простое приложение:

    <?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" minWidth="955" minHeight="600"
               keyDown="application1_keyDownHandler(event)"
               creationComplete="application1_creationCompleteHandler(event)"
               >

    <fx:Script>
        <![CDATA[
            import flash.utils.getQualifiedClassName;

            import mx.core.FlexGlobals;
            import mx.events.FlexEvent;
            protected function application1_keyDownHandler(event:KeyboardEvent):void
            {
                trace("Key Down Handler: key = " + event.keyCode);
            }

            protected function application1_creationCompleteHandler(event:FlexEvent):void
            {
                FlexGlobals.topLevelApplication.addEventListener(KeyboardEvent.KEY_DOWN, tlaKeyDownHandler);
                FlexGlobals.topLevelApplication.systemManager.addEventListener(KeyboardEvent.KEY_DOWN, smKeyDownHandler);
            }

            protected function tlaKeyDownHandler(event:KeyboardEvent):void
            {
                trace("Top Level Application Key Down Handler: key = " + event.keyCode);
            }

            protected function smKeyDownHandler(event:KeyboardEvent):void
            {
                trace("System Manager Key Down Handler: key = " + event.keyCode);
            }




        ]]>
    </fx:Script>

    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <s:Button x="130" y="135" label="Button"/>
    <s:ComboBox x="130" y="54"/>
    <s:TextInput x="130" y="99"/>
</s:Application>

Вот вывод:

Key Down Handler: ключ = 65

Обработчик ключа приложения верхнего уровня: ключ = 65

Обработчик ключа администратора системы: ключ = 65

Обработчик ключа вниз: ключ = 83

Обработчик ключа приложения верхнего уровня: ключ = 83

Обработчик ключа менеджера системы: ключ = 83

Обработчик ключа вниз: ключ = 68

Верхний уровеньОбработчик ключа приложения: ключ = 68

Обработчик ключа приложения вниз: ключ = 68

Как вы можете видеть, я создал три разных компонента в приложении и использовал три разных метода, чтобы пойматьсобытие.И во всех случаях (когда один из компонентов имеет фокус) событие запускается и перехватывается.

Возможно, вы не сказали нам что-то важное.

...