2

我想在 AS3 Air 项目中创建一个启用选项卡的弹出窗口。目前,当我按 Tab 几次时,焦点会穿过弹出窗口中的所有组件,然后开始关注弹出窗口后面组件中的按钮和 TextField。我试图以两种方式解决这个问题,但都没有奏效。我将在这里解释这两种方法


  1. 我从这里阅读了 adobe 的文档的官方方法,它描述了在我的情况下我应该做的事情,如下所示:

    “每个模态窗口组件都包含一个 FocusManager 的实例,因此该窗口上的控件成为自己的选项卡集。这可以防止用户通过按 Tab 键无意中导航到其他窗口中的组件。”但我还是不明白如何使用焦点管理器。

    • 我尝试通过将下面的代码放入构造函数中,在每个视图组件类中创建 FocusManager 的实例,但它不起作用:

    _focusManager = new FocusManager(this);

    • “模态窗口组件”是什么意思?
  2. 解决方法
    我尝试的另一件事是,当父组件调度 FOCUS_IN 或 FOCUS_OUT 事件时,手动将每个按钮和 TextField 上的 tabEnabled 属性设置为 true 或 false。这适用于我在新闪存文件上创建的一个简单示例,但它不适用于我的大型项目,而且我不知道如何调试它。但是,我很乐意将其转储并返回到方法 1。

有没有人遇到过这些问题?您是否以任何其他方式使用了多个标签循环?现在欢迎任何提示,因为我在这个问题上浪费了太多时间。谢谢[编辑]我对这个问题有很多看法,但没有相关答案,所以我对其进行了编辑并尝试简化它

4

3 回答 3

1

是的,标签可能是一个真正的痛苦。

我有一个类似的问题,在我打开一个弹出窗口后,标签停止工作。问题是弹出窗口在后台还活着并劫持了标签。

这解决了我的问题,现在单个 tabcycles 可用于主应用程序和弹出窗口:

// my popupclass

protected var fm:FocusManager;


public function show( centered:Boolean = true, parent:DisplayObject = null, modal:Boolean = true ):void {

// some code    
   fm = new FocusManager( this );
   fm.activate();

}

public function hide( closeType:int = 1 ):void {

   // more code
   fm.deactivate();

}
于 2013-09-14T14:53:15.683 回答
0

根据您要实现的目标,您也许可以使用 tabIndex 而不是 FocusManager。

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/flash/display/InteractiveObject.html#tabIndex

于 2010-09-14T09:52:04.217 回答
0

我最终编写了自己的 FocusManager 来满足我的需要。结果比我最初想象的要容易。很抱歉,我无法在此处发布代码,但我会简要介绍一下我所做的事情,希望对您有所帮助:

  • 我实现了fl.managers.IFocusManager接口,但我并不完全尊重旧经理的工作方式
  • 我的 CustomFocusManager 的构造函数需要一个可选项卡子元素的数组作为参数,并且子元素必须按照它们出现在循环中的顺序排列。通过这种方式,我不必关心孩子的类型(是否可选项卡?)或问自己是否存在 tabIndexes。
  • 我忽略了tabIndex属性
  • 我创建了一个名为IFocusManagerContainer的新接口,灵感来自同名的 Flex 接口
  • 我创建了一个类似于 Flex 的 SystemManager 的静态类,它知道何时根据舞台上找到的孩子激活/停用 FocusManager。

我查看了mx.managers.FocusManager代码,据我所见,他们的大部分精力都花在了处理所有可能使用 FocusManager 的情况上,这就是它如此冗长和复杂的原因。我只能假设fl.managers.FocusManagers看起来很相似。我敢打赌,我的仍然有很多问题,而且它不像 Adob​​e 的那样便携,但它非常简单,它可以满足我的需要。

我仍然希望看到一些关于如何正确使用现有 FocusManager 的指南。

于 2010-10-14T14:41:28.180 回答