使用 FocusManager

当用户按 Tab 键在 Flash 应用程序中导航时或在应用程序中单击时,FocusManager 类会确定接收输入焦点的组件。除非您正在创建组件,否则您无需向应用程序添加 FocusManager 实例,也不必编写任何代码来激活 FocusManager。

如果 RadioButton 对象接收焦点,FocusManager 将检查该对象和具有相同 groupName 值的所有对象,然后将焦点设置在 selected 属性设置为 true 的对象上。

每个模式窗口组件都包含 FocusManager 的一个实例,因此,该窗口上的控件也就成为它们自己的 Tab 集。这样可以防止用户按 Tab 切换到其它窗口中的组件。

FocusManager 使用容器中元素的深度级别(z 顺序)作为默认导航方案或“Tab 键循环”。用户通常使用 Tab 键来导航 Tab 键循环,焦点将从具有焦点的第一个组件移动到最后一个,然后再回到第一个。深度级别主要按组件拖到舞台上的顺序设置;但是,也可以使用“修改”>“排列”>“移至顶层”或“移至底层”命令来确定最终的 z 顺序。有关深度级别的详细信息,请参阅使用显示列表

可以调用 setFocus() 方法来使应用程序中的某一组件实例获得焦点。例如,下面的示例为当前容器 (this) 创建一个 FocusManager 实例,并且使 Button 实例 aButton 获得焦点。

var fm:FocusManager = new FocusManager(this); 
fm.setFocus(aButton);

可以通过调用 getFocus() 方法来确定哪个组件具有焦点;可以通过调用 getNextFocusManagerComponent() 方法来确定 Tab 键循环中哪个组件接下来将获得焦点。在下面的示例中,一个 CheckBox、一个 RadioButton 和一个 Button 在舞台上,每个组件都有 MouseEvent.CLICKFocusEvent.MOUSE_FOCUS_CHANGE 事件的侦听器。MouseEvent.CLICK 事件发生时,因为用户单击了组件,所以 showFocus() 函数调用 getNextFocusManagerComponent() 方法,以确定 Tab 键循环中哪个组件接下来将获得焦点。然后,它调用 setFocus() 方法来使该组件获得焦点。FocusEvent.MOUSE_FOCUS_CHANGE 事件发生时,fc() 函数显示发生了此事件的组件的名称。当用户单击不同于 Tab 键循环中下一个组件的组件时,触发此事件。

// This example assumes a CheckBox (aCh), a RadioButton (aRb) and a Button 
// (aButton) have been placed on the Stage. 
 
import fl.managers.FocusManager; 
import flash.display.InteractiveObject; 
 
var fm:FocusManager = new FocusManager(this); 
 
aCh.addEventListener(MouseEvent.CLICK, showFocus); 
aRb.addEventListener(MouseEvent.CLICK, showFocus); 
aButton.addEventListener(MouseEvent.CLICK, showFocus); 
aCh.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, fc); 
aRb.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, fc); 
aButton.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, fc); 
 
function showFocus(event:MouseEvent):void { 
    var nextComponent:InteractiveObject = fm.getNextFocusManagerComponent(); 
    trace("Next component in tab loop is: " + nextComponent.name); 
    fm.setFocus(nextComponent);  
} 
 
function fc(fe:FocusEvent):void { 
    trace("Focus Change: " + fe.target.name); 
}

若要创建在用户按下 Enter (Windows) 或 Return (Macintosh) 时接收焦点的 Button,请将 FocusManager.defaultButton 属性设置为要作为默认 Button 的 Button 实例,如下面的代码所示:

import fl.managers.FocusManager; 
 
var fm:FocusManager = new FocusManager(this); 
fm.defaultButton = okButton;

FocusManager 类会覆盖默认的 Flash Player 焦点矩形,并绘制一个圆角的自定义焦点矩形。

有关在 Flash 应用程序中创建焦点方案的详细信息,请参阅《用于 Adobe® Flash® Professional CS5 的 ActionScript® 3.0 参考》中的 FocusManager 类。若要创建自定义的焦点管理器,必须创建实现 IFocusManager 接口的类。有关详细信息,请参阅《用于 Adobe® Flash® Professional CS5 的 ActionScript® 3.0 参考》中的 IFocusManager