2011-04-07 47 views
2

我想做一个全局的eventListener。一切正常,KeyboardEvent.KEY_DOWN一直在触发..除了textInput有焦点的情况。全球eventListener,当重点内部texiInput

这里是我如何连接监听器:

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

我都试过(使用捕捉和没有它)。我错过了什么?

感谢您的时间:)

+0

我猜TextInput停止传播KeyboardEvent事件。 也许你可以扩展它并自己重新发送事件 – 2011-04-07 14:45:52

+0

可能在一个小应用程序中工作,但在一个巨大的应用程序中该怎么做? ..我会自杀,如果我会算,有多少textInputs我应该更换xD ..但无论如何,谢谢你的提示:) – Antenka 2011-04-07 14:53:01

+0

我从来没有想过如何使用捕获...这应该是完美的场合,如果你有更多的信息.​​.. – Kodiak 2011-04-07 14:54:13

回答

0

嗯......我真的不明白是什么问题。

这里有一个简单的应用程序:

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

系统管理员按键处理程序:key = 65

按键处理程序:k EY = 83

顶级应用程序键按下处理程序:键= 83

系统管理器键按下处理程序:键= 83

键按下处理程序:键= 68

顶级应用程序键按下处理器:关键= 68

系统管理器键按下处理程序:键= 68

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

也许你没有告诉我们重要的事情。

+0

的确,好的,让我们澄清一下我的情况。第一个也许是与我的代码最重要的区别是我的mx指的是“http://www.adobe.com/2006/mxml”。接下来 - 我将监听器附加到自定义类中(没有明确指定基类)。 – Antenka 2011-04-08 08:23:07

1

首先,我不知道为什么您使用systemManager作为您的侦听器对象,因为它不是显示列表的一部分,因此它不能获取冒泡事件。其次,使用FlexGlobals并不是做事情的最佳方式(除了将它用于弹出窗口外,我没有看到为什么要使用它)。

如果您想倾听全球事件,只需将它放在舞台上即可。每个视图组件都有一个'stage'属性,指向您的flex应用程序的主要阶段。试试这个:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); 
+0

好吧..我们这里去:1)似乎使用'systemManager',而不是'stage'是我的错误; 2)我正在使用FlexGlobals,因为我在AS类中附加了监听器,它没有指定明确的基类。正如你所建议的那样,这阻止了我提到“舞台”。 – Antenka 2011-04-08 08:19:10

+0

啊,那么我猜如果你使用的是AS类,那可以接受。从编码的角度来看,我个人更喜欢的是,你正在实例化的类将在DisplayObject中作为构造函数参数,除非它不在显示列表的任何位置实例化。那么在那种情况下使用FlexGlobals。 – 2011-04-08 14:21:02