键盘事件的事件监听器不在模块中监听

时间:2011-07-08 15:19:14

标签: actionscript-3 flex flex3

我在包含viewstacks及其子节点的模块中执行此操作。 在模块的creationComplete上调用onInit()。

当我在这个模块的视图堆栈的一个子节点内并按Enter时,它根本不会调用监听器功能(bp里面没有被击中)。

private function onInit():void{
 this.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
}

private function keyPressed(evt:KeyboardEvent):void
           {//this breakpoint never gets hit on pressing a key in screen
               if (evt.keyCode == Keyboard.ENTER)
               {
                //do this   
                   }               
           }

2 个答案:

答案 0 :(得分:1)

您应该为舞台对象添加关键侦听器:

private function onInit():void{
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressed);
}

答案 1 :(得分:1)

这可能非常令人沮丧,因为有一些不同的事情会影响这一点。

1)在适当的地方添加您的事件监听器。您拥有的代码可以很好地捕获,只需确保它位于事件被触发的父级或上方。

2)你需要确保你有焦点。这通常是人们遇到的问题,它在文档中,但不是立即清楚。如果你在这里查看实时文档链接并搜索setFocus() - 你会注意到它出现在他们的每一个例子中(除了top,它已经坏了!) - 然而,他们从未提及过它在页面上的实际文档中。

http://livedocs.adobe.com/flex/3/html/help.html?content=events_11.html

所以,即使在他们的第一个例子中,如果你点击应用程序(而不是文本框),它就不会工作!

<?xml version="1.0"?>
<!-- events/TrapAllKeys.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="initApp();">
<mx:Script><![CDATA[
    private function initApp():void {
        application.addEventListener(KeyboardEvent.KEY_UP, keyHandler);
    }

    private function keyHandler(event:KeyboardEvent):void {
        t1.text = event.keyCode + "/" + event.charCode;
    }
]]></mx:Script>

<mx:TextInput id="myTextInput"/>

<mx:Text id="t1"/>

</mx:Application>

但是,如果您通过更改这样的init函数来自己设置焦点,它将会!

private function initApp():void {
        application.addEventListener(KeyboardEvent.KEY_UP, keyHandler);
        myTextInput.setFocus();
    }

测试这是否是您的问题的另一个技巧是添加一个文本框作为具有捕获的容器的子项,如果它们在您单击该文本框后神奇地工作 - 它确实是一个焦点问题!

=)