Работа с FocusManager

Когда пользователь нажимает клавишу Tab, для перехода к элементам в приложении Flash или щелкает элементы приложения мышью, класс FocusManager определяет, какой компонент получает фокус для ввода. Не требуется добавлять экземпляр FocusManager в приложение или создавать код для активации FocusManager, если только не нужно создать этот компонент.

Если объект RadioButton получает фокус, FocusManager анализирует этот и все остальные объекты с одинаковым значением groupName и переводит фокус на объект, у которого свойство selected имеет значение true .

Каждый модальный компонент Window содержит экземпляр FocusManager, поэтому элементы управления в этом окне получают собственный порядок табуляции. Это предотвращает непреднамеренный переход пользователя к компонентам в других окнах при нажатии клавиши Tab.

Экземпляр FocusManager использует уровень глубины элементов в контейнере (или порядок по оси z в качестве схемы перехода, или цикла табуляции , по умолчанию. Пользователь обычно переходит по циклу табуляции с помощью клавиши Tab, причем фокус переходит от первого компонента в фокусе к последнему, а затем снова к первому. Уровни глубины определяются, главным образом, порядком, в котором компоненты перетаскивались в рабочую область, однако для определения окончательного порядка по оси z можно использовать команды «Модификация» > «Упорядочить» > «Переместить на передний план»/»Переместить назад». Дополнительные сведения об уровнях глубины см. в разделе Работа со списком отображения .

Можно вызвать метод setFocus() , чтобы переместить фокус на определенный экземпляр компонента в приложении. Следующий пример создает экземпляр FocusManager для текущего контейнера ( this ) и переводит фокус на экземпляр Button с именем aButton .

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

Чтобы определить, какой компонент получил фокус, нужно вызвать метод getFocus() . А чтобы определить, какой компонент в цикле табуляции получить фокус следующим, нужно вызвать метод getNextFocusManagerComponent() . В следующем примере экземпляры CheckBox, RadioButton и Button находятся в рабочей области, каждый из них имеет прослушиватели для событий MouseEvent.CLICK и FocusEvent.MOUSE_FOCUS_CHANGE . Когда происходит событие MouseEvent.CLICK в результате щелчка по компоненту, функция showFocus() вызывает метод getNextFocusManagerComponent() для определения, какой компонент в цикле табуляции получит фокус следующим. Затем вызывается метод setFocus() , чтобы перевести фокус на этот компонент. Когда происходит событие FocusEvent.MOUSE_FOCUS_CHANGE функция fc() отображает имя компонента, отправившего это событие. Это событие запускается, когда пользователь щелкает компонент, который не является следующим в цикле табуляции.

// 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); 
}

Чтобы создать экземпляр Button, получающий фокус при нажатии клавиши Enter (Windows) или Return (Macintosh), задайте для свойства FocusManager.defaultButton экземпляр Button, который должен быть кнопкой по умолчанию, как показано в следующем коде.

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

Класс FocusManager переопределяет прямоугольник фокуса по умолчанию для Flash Player и рисует пользовательский прямоугольник фокуса со скругленными краями.

Дополнительные сведения о создании схемы перехода фокуса см. в описании класса FocusManager в справочнике ActionScript® 3.0 для Adobe® Flash® Professional CS5 . Чтобы создать пользовательский диспетчер фокуса, необходимо создать класс, реализующий интерфейс IFocusManager . Дополнительные сведения см. в описании интерфейса IFocusManager в справочнике ActionScript® 3.0 для Adobe® Flash® Professional CS5 .