FocusManager の操作

ユーザーが Tab キーを押して Flash アプリケーション内を移動したり、アプリケーション内をクリックしたりすると、FocusManager クラスは入力フォーカスを受け取るコンポーネントを判別します。 コンポーネントを作成している場合を除いて、FocusManager を有効にするために FocusManager インスタンスをアプリケーションに追加したり、コードを作成したりする必要はありません。

RadioButton オブジェクトがフォーカスを取得した場合、FocusManager は、そのオブジェクトと、共通の groupName 値を持つすべてのオブジェクトを検査し、 selected プロパティが true であるオブジェクトにのみフォーカスを設定します。

各モーダル Window コンポーネントは FocusManager のインスタンスを備えており、そのウィンドウ上のコントロールは独自のタブセットになります。 そのため、ユーザーが Tab キーを押して、意図せずに他のウィンドウ上にあるコンポーネントに移動することはありません。

FocusManager では、コンテナ内のエレメントの深度(z 順序)が、デフォルトのナビゲーション順序(タブループ)として使用されます。通常、タブループ内の移動には Tab キーを使用します。Tab キーを押すごとに、フォーカスは先頭の(フォーカスを持つ)コンポーネントから最後のコンポーネントまで順に移動し、再び先頭のコンポーネントに戻ります。深度は最初、コンポーネントがステージにドラッグされた順序によって設定されます。ただし、修正/重ね順/「最前面へ」または「最背面へ」コマンドを使用して、最終的な z 順序を決定することもできます。深度について詳しくは、 表示リストの操作 を参照してください。

アプリケーションでコンポーネントインスタンスにフォーカスを設定するには、 setFocus() メソッドを呼び出します。例えば、次の例では現在のコンテナ( this )の FocusManager インスタンスを作成し、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); 
}

ユーザーが Enter キー(Windows)または Return キー(Macintosh)を押した場合にフォーカスを取得するボタンを作成するには、次のコードのように、デフォルトボタンにする Button インスタンスを FocusManager.defaultButton プロパティに設定します。

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 を参照してください。