Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 全局事件侦听器,当焦点位于texiInput内时_Apache Flex_Focus_Listener_Global_Textinput - Fatal编程技术网

Apache flex 全局事件侦听器,当焦点位于texiInput内时

Apache flex 全局事件侦听器,当焦点位于texiInput内时,apache-flex,focus,listener,global,textinput,Apache Flex,Focus,Listener,Global,Textinput,我想做一个全球事件监听器。一切正常,KeyboardEvent.KEY_DOWN一直启动。。文本输入有焦点的情况除外 以下是我如何附加侦听器: FlexGlobals.topLevelApplication.systemManager.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true); 我尝试了两种方法(使用捕获和不使用捕获)。我错过了什么 谢谢您的时间:)嗯。。。我真的不明白出了什么问题 以下是一个简单的应用程序:

我想做一个全球事件监听器。一切正常,
KeyboardEvent.KEY_DOWN
一直启动。。文本输入有焦点的情况除外

以下是我如何附加侦听器:

FlexGlobals.topLevelApplication.systemManager.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler, true);
我尝试了两种方法(使用捕获和不使用捕获)。我错过了什么


谢谢您的时间:)

嗯。。。我真的不明白出了什么问题

以下是一个简单的应用程序:

    <?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>

下面是一个输出:

键关闭处理程序:键=65

顶级应用程序密钥向下处理程序:密钥=65

系统管理器密钥关闭处理程序:密钥=65

键关闭处理程序:键=83

顶级应用程序键关闭处理程序:键=83

系统管理器密钥关闭处理程序:密钥=83

键关闭处理程序:键=68

顶级应用程序键关闭处理程序:键=68

系统管理器密钥关闭处理程序:密钥=68

如您所见,我在应用程序中创建了三个不同的组件,并使用了三种不同的方法来捕获事件。并且在所有情况下(当其中一个组件具有焦点时),都会触发并捕获事件


可能您没有告诉我们一些重要的事情。

首先,我不知道您为什么要使用
systemManager
作为侦听器对象,因为它不是显示列表的一部分,因此无法获取冒泡事件。其次,使用FlexGlobals并不是做事情的最佳方式(就个人而言,除了在弹出窗口中使用它之外,我看不出有多少理由应该使用它)

如果你想听到一个全球性的事件,就把它放在舞台上。每个视图组件都有一个“阶段”属性,它指向flex应用程序的主阶段。试试这个:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);

我猜TextInput会停止KeyboardEvent事件的传播。也许您可以扩展它并重新分派事件,您自己可能在一个小应用程序中工作,但是在一个大应用程序中该怎么做呢。。如果我数一数,我会自杀,我应该替换多少文本输入xD。。但不管怎样,谢谢你的提示:)我从来没有想过如何使用捕获。。。这应该是一个完美的时机,如果你有进一步的信息…你仍然可以修补原始的TextInput,有风险的解决方案,但我没有更好的sorry@Kodiak就我而言,什么时候去看这场比赛并不重要。我已经说过了,因为不是所有的组件都有这些捕获阶段。。我试过两种变体。如果对事件流感兴趣,请阅读以下内容:默认情况下,flex会在事件冒泡的时刻添加侦听器,但您可以更早地捕获它,只需说
useCapture=true
,事件就会在捕获阶段被捕获。Ok。。我们开始:1)似乎使用
systemManager
,而不是
stage
是我的错误;2) 我使用FlexGlobals,因为我在AS类中附加侦听器,该类没有明确指定基类。这使我不能像你建议的那样引用
stage
。啊,那么我想如果你使用的是AS类,那是可以接受的。从编码的角度来看,我个人更喜欢的是,您正在实例化的类将接受一个
DisplayObject
作为构造函数参数,除非它没有在显示列表的任何地方实例化。然后在这种情况下使用FlexGlobals。事实上,好的,让我们澄清一下我的情况。与我的代码的第一个可能也是最重要的区别是,我的mx指的是“”。接下来-我将在自定义类中附加侦听器(没有显式指定基类)。