使用 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.CLICK FocusEvent.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