在Flex中调试焦点和事件传播

时间:2009-12-18 15:23:49

标签: flex actionscript-3 debugging

我有一个自定义TitleWindow组件,该组件已注册以侦听来自用户的键盘事件(以便esc关闭窗口,输入保存等)。但是,在我的测试中,我发现了一些我的键盘事件处理程序无法触发的情况。

我最好的猜测是,为什么会发生这种情况,有一些儿童组件在某个地方失去了焦点,并阻止了键盘事件的传播。不幸的是,由于TitleWindow中的组件数量很多,我无法知道谁偷了焦点。

我的问题是,是否有任何好的技巧/工具/工具可用于调试Flex中的焦点问题和事件传播?基本上,我需要能告诉我谁在任何特定时间都有焦点以及谁在任何特定时间处理事件......这是可能的吗?

2 个答案:

答案 0 :(得分:1)

利用Focus Manager,您可以调用getFocus(),然后您将收到当前具有焦点的IFocusManagerComponent后退。

从那里,您可以使用flash.utils.getQualifiedClassName()确定哪种类型的对象被盗,并采取相应行动。

对于任何给定时间的事件处理,您希望将e.target与e.currentTarget进行比较。

答案 1 :(得分:0)

我刚刚发现以下技术在调试焦点问题时可能非常有用:

private function handleTextInputFocus(event:FocusEvent):void {
  try {
    throw new Error('test');
  } catch (e:Error) {
    trace(e.getStackTrace());
  }
}

堆栈可以解释为什么文本输入会从另一个组件中窃取焦点。