メニューの基本

Flash Player 9 以降、Adobe AIR 1.0 以降

AIR アプリケーションでのネイティブメニューの作成に関する簡単な説明およびコード例については、Adobe Developer Connection で次のクイックスタートの記事を参照してください。

ネイティブメニュークラスを使用すると、アプリケーションを実行しているオペレーティングシステムのネイティブメニュー機能にアクセスすることができます。NativeMenu オブジェクトは、アプリケーションメニュー(Mac OS X で使用可能)、ウィンドウメニュー(Windows および Linux で使用可能)、コンテキストメニューおよびポップアップメニューに使用できます。

AIR の外部で、コンテキストメニュークラスを使用することにより、アプリケーションでユーザーがオブジェクトを右クリックまたは Command キーを押しながらクリックしたときに Flash Player で自動的に表示するコンテキストメニューを変更できます(自動コンテキストメニューは AIR アプリケーションでは表示されません)。

メニュークラス

メニュークラスには、次のクラスが含まれます。

パッケージ

クラス

flash.display

flash.ui

flash.events

メニューのタイプ

AIR では、次のタイプのメニューをサポートしています。

コンテキストメニュー
コンテキストメニューは、SWF コンテンツ内のインタラクティブオブジェクトまたは HTML コンテンツ内のドキュメントエレメントを右クリックまたは Command キーを押しながらクリックすると開くメニューです。

Flash Player ランタイムでは、コンテキストメニューが自動的に表示されます。ContextMenu および ContextMenuItem クラスを使用して、メニューに独自のコマンドを追加できます。また、ビルトインコマンドの一部(全部ではなく)を削除できます。

AIR ランタイムでは、NativeMenu クラスまたは ContextMenu クラスを使用して、コンテキストメニューを作成できます。AIR の HTML コンテンツでは、Webkit HTML や JavaScript の API を使用して、コンテキストメニューを HTML エレメントに追加できます。

アプリケーション メニュー(AIR のみ)
アプリケーションメニューは、アプリケーション全体に適用されるグローバルなメニューです。アプリケーションメニューは Mac OS X でサポートされ、Windows および Linux ではサポートされません。Mac OS X では、オペレーティングシステムで自動的にアプリケーションメニューが作成されます。AIR のメニュー API を使用すると、標準のメニューにアイテムやサブメニューを追加したり、既存のメニューコマンドを処理するリスナーを追加したり、既存のアイテムを削除したりすることができます。

ウィンドウメニュー(AIR のみ)
ウィンドウメニューは、1 つのウィンドウに関連付けられるメニューで、タイトルバーの下に表示されます。NativeMenu オブジェクトを作成して NativeWindow オブジェクトの menu プロパティに割り当てることで、ウィンドウにメニューを追加できます。ウィンドウメニューは Windows および Linux オペレーティングシステムでサポートされ、Mac OS X ではサポートされません。ネイティブウィンドウメニューは、システムクロムを持つウィンドウでのみ使用できます。

ドックおよびシステムトレイアイコンメニュー(AIR のみ)
これらのアイコンメニューは、コンテキストメニューに似ており、Mac OS X の場合はドック内、Windows および Linux の場合はタスクバーの通知領域内に表示されるアプリケーションアイコンに割り当てられます。ドックおよびシステムトレイアイコンメニューでは、NativeMenu クラスが使用されます。Mac OS X では、メニューのアイテムは、オペレーティングシステムの標準のアイテムの上に追加されます。Windows または Linux では、標準のメニューはありません。

ポップアップメニュー(AIR のみ)
AIR のポップアップメニューはコンテキストメニューに似ていますが、特定のアプリケーションオブジェクトまたはコンポーネントに必ずしも関連付けられません。ポップアップメニューは、任意の NativeMenu オブジェクトの display() メソッドを呼び出すことで、ウィンドウ内の任意の位置に表示できます。

カスタムメニュー
ネイティブメニューは、完全にオペレーティングシステムによって描画されるため、Flash や HTML のレンダリングモデル内に含めることはできません。ネイティブメニューを使用する代わりに、MXML、ActionScript または JavaScript(AIR の場合)を使用して独自のカスタム非ネイティブメニューをいつでも作成できます。そのようなメニューは、アプリケーションコンテンツ内で完全にレンダリングされる必要があります。

Flex メニュー
Adobe® Flex™ フレームワークには、一連の Flex メニューコンポーネントが用意されています。Flex メニューは、オペレーティングシステムではなくランタイムによって描画されるメニューであり、ネイティブメニューではありません。Flex メニューコンポーネントは、システムクロムを持たない Flex ウィンドウに使用することができます。Flex メニューコンポーネントを使用するもう 1 つのメリットは、メニューを MXML 形式で宣言的に指定できることです。Flex フレームワークを使用する場合、ウィンドウメニューには、ネイティブクラスではなく Flex メニュークラスを使用します。

デフォルトメニュー(AIR のみ)

オペレーティングシステムまたは AIR ビルトインクラスで、次のデフォルトのメニューが提供されます。

  • Mac OS X のアプリケーションメニュー

  • Mac OS X のドックアイコンメニュー

  • HTML コンテンツの選択されたテキストおよびイメージに対応するコンテキストメニュー

  • TextField オブジェクト(または TextField を拡張するオブジェクト)の選択されたテキストに対応するコンテキストメニュー

コンテキストメニューについて

SWF コンテンツでは、InteractiveObject を継承するオブジェクトの contextMenu プロパティにメニューオブジェクトを割り当てることによって、そのオブジェクトにコンテキストメニューを含めることができます。「進む」、「戻る」、「印刷」、「品質」、「ズーム」などのいくつかのコマンドは、デフォルトで組み込まれています。AIR ランタイムでは、 contextMenu に割り当てることができるメニューオブジェクトのタイプは、NativeMenu または ContextMenu です。Flash Player ランタイムでは、ContextMenu クラスだけを使用できます。

ContextMenu クラスと ContextMenuItem クラスを使用する場合、ネイティブメニューイベントまたはコンテキストメニューイベントをリッスンできます。両方のクラスが送出されます。ContextMenuEvent オブジェクトのプロパティの利点の 1 つは、contextMenuOwner はメニューが関連付けられているオブジェクトを識別し、 mouseTarget はメニューを開くためにクリックされたオブジェクトを識別する点です。この情報は、NativeMenuEvent オブジェクトからは使用できません。

次の例では、Sprite を作成し、単純な編集コンテキストメニューを追加します。

var sprite:Sprite = new Sprite(); 
sprite.contextMenu = createContextMenu() 
private function createContextMenu():ContextMenu{ 
    var editContextMenu:ContextMenu = new ContextMenu(); 
    var cutItem:ContextMenuItem = new ContextMenuItem("Cut") 
    cutItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCutCommand); 
    editContextMenu.customItems.push(cutItem); 
     
    var copyItem:ContextMenuItem = new ContextMenuItem("Copy") 
    copyItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doCopyCommand);             
    editContextMenu.customItems.push(copyItem); 
     
    var pasteItem:ContextMenuItem = new ContextMenuItem("Paste") 
    pasteItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, doPasteCommand); 
    editContextMenu.customItems.push(pasteItem); 
         
    return editContextMenu 
} 
private function doCutCommand(event:ContextMenuEvent):void{trace("cut");} 
private function doCopyCommand(event:ContextMenuEvent):void{trace("copy");} 
private function doPasteCommand(event:ContextMenuEvent):void{trace("paste");}
注意: ブラウザー環境で表示される SWF コンテンツとは異なり、AIR のコンテキストメニューにはビルトインコマンドはありません。

Flash Player コンテキストメニューのカスタマイズ

ブラウザーまたはプロジェクターでは、SWF コンテンツのコンテキストメニューに常にビルトインアイテムが含まれます。「設定」および「Flash Player について」コマンド以外のデフォルトのコマンドは、すべてメニューから削除できます。 そうするには、Stage プロパティ showDefaultContextMenu false に設定します。

特定の表示オブジェクトに対してカスタマイズしたコンテキストメニューを作成する場合、ContextMenu クラスの新しいインスタンスを作成して hideBuiltInItems() メソッドを呼び出し、そのインスタンスを該当の DisplayObject インスタンスの contextMenu プロパティに割り当てます。次の例では、動的に描画される四角形に、色をランダムに変更するコンテキストメニューコマンドを設定します。

var square:Sprite = new Sprite(); 
square.graphics.beginFill(0x000000); 
square.graphics.drawRect(0,0,100,100); 
square.graphics.endFill(); 
square.x = 
square.y = 10; 
addChild(square); 
 
var menuItem:ContextMenuItem = new ContextMenuItem("Change Color"); 
menuItem.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,changeColor); 
var customContextMenu:ContextMenu = new ContextMenu(); 
customContextMenu.hideBuiltInItems(); 
customContextMenu.customItems.push(menuItem); 
square.contextMenu = customContextMenu; 
 
function changeColor(event:ContextMenuEvent):void 
{ 
    square.transform.colorTransform = getRandomColor(); 
} 
function getRandomColor():ColorTransform 
{ 
    return new ColorTransform(Math.random(), Math.random(),         Math.random(),1,(Math.random() * 512) - 255,         (Math.random() * 512) -255, (Math.random() * 512) - 255, 0); 
}

ネイティブメニューの構造(AIR)

ネイティブメニューは、性質として階層的な構造をしています。NativeMenu オブジェクトには、子の NativeMenuItem オブジェクトが含まれます。さらに、サブメニューを表す NativeMenuItem オブジェクトに NativeMenu オブジェクトを含めることができます。構造内の最上位レベル、つまりルートレベルのメニューオブジェクトは、アプリケーションメニューおよびウィンドウメニューのメニューバーを表します(コンテキスト、アイコンおよびポップアップの各メニューにはメニューバーはありません)。

次の図に、典型的なメニューの構造を示します。ルートメニューはメニューバーを表しており、 File サブメニューおよび Edit サブメニューを参照する 2 つのメニューアイテムが含まれています。この構造の File サブメニューには、2 つのコマンドアイテムと、 Open Recent Menu サブメニュー(このサブメニュー自体にも 3 つのアイテムが含まれています)を参照するアイテムが含まれています。Edit サブメニューには、3 つのコマンドと 1 つのセパレーターが含まれています。

サブメニューを定義するには、NativeMenu オブジェクトと NativeMenuItem オブジェクトの両方が必要です。NativeMenuItem オブジェクトでは親メニューに表示されるラベルが定義され、ユーザーはこのオブジェクトを使用してサブメニューを開くことができます。NativeMenu オブジェクトは、サブメニューのアイテムのコンテナとして機能します。NativeMenuItem オブジェクトでは、NativeMenuItem の submenu プロパティを通して NativeMenu オブジェクトを参照します。

このメニューを作成するコードの例については、 ネイティブメニューの例:ウィンドウメニューとアプリケーションメニュー(AIR) を参照してください。

メニューイベント

NativeMenu オブジェクトと NativeMenuItem オブジェクトは、どちらも preparing イベント、 displaying イベント、 select イベントを送出します。

preparing: オブジェクトがユーザー操作を開始する直前に、登録されているすべてのリスナーに対して、メニューおよびそのメニューアイテムから preparin イベントが送出されます。操作には、メニューを開く操作やキーボードショートカットによるアイテムの選択などが含まれます。
注意: preparing イベントは、Adobe AIR 2.6 以降のみで利用できます。
displaying:
メニューが表示される直前に、メニューおよびそのメニューアイテムから、登録されているすべてのリスナーに displaying イベントが送出されます。

preparing イベントと displaying イベントにより、メニューの内容やアイテムの外観を、ユーザーに表示される前に更新できます。例えば、最近使用したファイルを開くメニューの displaying イベントのリスナーでは、最近表示したドキュメントの最新の一覧を反映するようにメニューアイテムを変更することができます。

preparing イベントをトリガーしたキーボードショートカットに対応するメニューアイテムを削除すると、メニュー操作は事実上キャンセルされ、 select イベントは送出されません。

イベントの target プロパティと currentTarget プロパティはどちらもリスナーの登録先のオブジェクト(メニューそのものかメニューアイテムの 1 つ)です。

preparing イベントは displaying イベントの前に送出されます。通常はこれらのイベントの両方をリッスンすることはなく、一方のみをリッスンします。

select:
コマンドアイテムがユーザーによって選択されると、そのアイテムから、登録されているすべてのリスナーに select イベントが送出されます。サブメニューアイテムとセパレーターアイテムは選択できないため、これらから select イベントが送出されることはありません。

select イベントは、メニューアイテムからそれを含むメニューへと、ルートメニューに達するまでバブルします。 select イベントは、アイテムで直接リッスンすることも、メニュー構造の上位でリッスンすることもできます。 select イベントをメニューでリッスンする場合は、そのイベントの target プロパティを使用して、選択されたアイテムを識別できます。メニュー階層の上方にイベントがバブルしていくのに合わせて、イベントオブジェクトの currentTarget プロパティは、現在のメニューオブジェクトを識別します。

注意: ContextMenu オブジェクトと ContextMenuItem オブジェクトでは、 menuItemSelect イベントと menuSelect イベントに加え、 select イベント、 preparing イベント、 displaying イベントも送出します。

ネイティブメニューコマンドと等価なキー(AIR)

メニューコマンドにキーボードショートカット(アクセラレーター)を割り当てることができます。キーまたはキーの組み合わせが押されると、メニューアイテムから、登録されているすべてのリスナーに select イベントが送出されます。アイテムが格納されるメニューは、コマンドが呼び出されるアプリケーションまたはアクティブなウィンドウのメニューの一部である必要があります。

キーボードショートカットは 2 つの部分から構成されます。主キーを表すストリングと、一緒に押される必要がある修飾キーの配列です。主キーを割り当てるには、メニューアイテムの keyEquivalent プロパティに、そのキーの 1 文字のストリングを設定します。大文字を使用した場合、修飾キーの配列に Shift キーが自動的に追加されます。

Mac OS X では、デフォルトの修飾キーは Command キー( Keyboard.COMMAND )です。Windows および Linux では、Ctrl キー( Keyboard.CONTROL )です。これらのデフォルトのキーは、修飾キーの配列に自動的に追加されます。別の修飾キーを割り当てるには、そのキーコードを含む新しい配列を keyEquivalentModifiers プロパティに割り当てます。デフォルトの配列は上書きされます。デフォルトの修飾キーを使用するか独自の修飾キーの配列を割り当てるかに関係なく、 keyEquivalent プロパティに割り当てたストリングが大文字の場合は Shift キーが追加されます。修飾キーに使用するキーコードの定数は、Keyboard クラスで定義されています。

割り当てられたキーボードショートカットのストリングは、自動的にメニューアイテム名の横に表示されます。形式は、ユーザーのオペレーティングシステムおよびシステムの環境設定によって異なります。

注意: Windows オペレーティングシステムでキー修飾の配列に Keyboard.COMMAND 値を割り当てた場合、メニューにキーボードショートカットは表示されません。ただし、そのメニューコマンドをアクティブにするには Ctrl キーを使用する必要があります。

次の例では、メニューアイテムのキーボードショートカットとして Ctrl+Shift+G を割り当てます。

var item:NativeMenuItem = new NativeMenuItem("Ungroup"); 
item.keyEquivalent = "G"; 

次の例では、修飾キーの配列を直接設定することにより、キーボードショートカットとして Ctrl+Shift+G を割り当てます。

var item:NativeMenuItem = new NativeMenuItem("Ungroup"); 
item.keyEquivalent = "G"; 
item.keyEquivalentModifiers = [Keyboard.CONTROL]; 
注意: キーボードショートカットでトリガーできるのは、アプリケーションメニューまたはウィンドウメニューのみです。コンテキストメニューまたはポップアップメニューにキーボードショートカットを追加した場合、メニューラベルにはキーボードショートカットが表示されますが、関連付けられたメニューコマンドを呼び出すことはできません。

ニーモニック(AIR)

ニーモニックは、オペレーティングシステムのメニューのキーボードインターフェイスの一部です。Linux、Mac OS X および Windows では、いずれもキーボードでメニューを開いてコマンドを選択する操作ができますが、その方法には微妙な違いがあります。

Mac OS X では、ユーザーはメニューまたはコマンドの最初の 1 文字か 2 文字を入力して、Return キーを押します。 mnemonicIndex プロパティは無視されます。

Windows では、これを 1 文字だけで実行できます。デフォルトでは、有効な文字はラベルの最初の文字ですが、メニューアイテムにニーモニックを割り当てると、有効な文字は指定した文字になります。メニュー内の 2 つのアイテムの有効な文字が同じ場合(ニーモニックが割り当てられているかどうかに関係なく)、メニューのキーボード操作が少し異なります。1 文字入力してメニューまたはコマンドを選択するのではなく、ユーザーは必要な回数だけその文字を入力して対象のアイテムを強調表示してから、Enter キーを押して選択を完了する必要があります。動作の一貫性を維持するために、ウィンドウメニューでは、メニュー内のアイテムそれぞれに異なるニーモニックを割り当てることをお勧めします。

Linux では、既定のニーモニックは設定されません。メニューアイテムの mnemonicIndex プロパティ値を設定することでニーモニックを指定する必要があります。

ニーモニック文字は、ラベルストリングのインデックスとして指定します。ラベルの最初の文字のインデックスは 0 です。したがって、「Format」というラベルのメニューアイテムのニーモニックとして「r」を使用するには、 mnemonicIndex プロパティを 2 に設定します。

var item:NativeMenuItem = new NativeMenuItem("Format"); 
item.mnemonicIndex = 2; 

メニューアイテムの状態

メニューアイテムには、状態を表すプロパティとして、 checked および enabled という 2 つのプロパティがあります。

checked
true に設定すると、アイテムラベルの横にチェックマークが表示されます。
var item:NativeMenuItem = new NativeMenuItem("Format"); 
item.checked = true; 

enabled
値を true false で切り替えて、コマンドを有効にするかどうかを制御します。無効にしたアイテムは「グレー表示」され、そのアイテムからは select イベントは送出されません。
var item:NativeMenuItem = new NativeMenuItem("Format"); 
item.enabled = false; 

メニューアイテムへのオブジェクトの関連付け

NativeMenuItem クラスの data プロパティを使用して、各アイテムの任意のオブジェクトを参照できます。例えば、最近使用したファイルを開くメニューでは、それぞれのメニューアイテムに各ドキュメントの File オブジェクトを割り当てることができます。

var file:File = File.applicationStorageDirectory.resolvePath("GreatGatsby.pdf") 
var menuItem:NativeMenuItem = docMenu.addItem(new NativeMenuItem(file.name)); 
menuItem.data = file;