메뉴 기본 사항

Flash Player 9 이상, Adobe AIR 1.0 이상

AIR 응용 프로그램의 기본 메뉴 생성에 대한 간략한 설명과 코드 예제를 보려면 Adobe Developer Connection의 다음 퀵 스타트 문서를 참조하십시오.

기본 메뉴 클래스를 사용하면 응용 프로그램이 실행되고 있는 운영 체제의 기본 메뉴 기능에 액세스할 수 있습니다. NativeMenu 객체는 응용 프로그램 메뉴(Mac OS X에서 사용할 수 있음), 윈도우 메뉴(Windows 및 Linux에서 사용할 수 있음), 컨텍스트 메뉴 및 팝업 메뉴에 대해 사용할 수 있습니다.

AIR 응용 프로그램 외부에서는 컨텍스트 메뉴 클래스를 사용하여, 응용 프로그램에서 객체를 마우스 오른쪽 버튼으로 클릭하거나 cmd 키를 누른 상태에서 클릭할 때 Flash Player가 자동으로 표시하는 컨텍스트 메뉴를 수정할 수 있습니다. AIR 응용 프로그램에는 자동 컨텍스트 메뉴가 표시되지 않습니다.

메뉴 클래스

Menu 클래스에는 다음이 포함됩니다.

메뉴 유형

AIR에서는 다음 메뉴 유형을 지원합니다.

컨텍스트 메뉴
컨텍스트 명령은 SWF 내용의 대화형 객체 또는 HTML 내용의 문서 요소에서 오른쪽 버튼 클릭이나 명령 클릭에 응답하여 열립니다.

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에만 해당)
윈도우 메뉴는 하나의 윈도우에 연결되어 있으며 제목 표시줄 아래에 표시됩니다. 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 메뉴 구성 요소를 사용하면 메뉴를 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 객체 속성의 이점 한 가지는 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 내용의 컨텍스트 메뉴에는 항상 기본 제공 명령이 내장되어 있습니다. [설정] 및 [정보] 명령을 제외한 모든 기본 명령은 메뉴에서 제거할 수 있습니다. 스테이지 속성 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 하위 메뉴를 참조하는 두 개의 메뉴 항목을 포함합니다. 이 구조에서 File 하위 메뉴에는 자체적으로 세 개의 항목을 포함한 Open Recent Menu 하위 메뉴와 두 개의 명령 항목이 포함됩니다. Edit 하위 메뉴에는 세 개의 명령과 분리 기호가 포함됩니다.

하위 메뉴를 정의하려면 NativeMenu 및 NativeMenuItem 객체가 모두 필요합니다. NativeMenuItem 객체는 부모 메뉴에 표시되는 레이블을 정의하고 사용자가 하위 메뉴를 열 수 있게 합니다. NativeMenu 객체는 하위 메뉴의 항목에 대한 컨테이너 역할을 합니다. NativeMenuItem 객체는 NativeMenuItem submenu 속성을 통해 NativeMenu 객체를 참조합니다.

이 메뉴를 만드는 코드 예제를 보려면 기본 메뉴 예제: 윈도우 및 응용 프로그램 메뉴(AIR) 를 참조하십시오.

메뉴 이벤트

NativeMenu 및 NativeMenuItem 객체는 모두 preparing , displaying , select 이벤트를 전달합니다.

preparing: 객체가 사용자 상호 작용을 시작할 때마다 메뉴 및 메뉴 항목은 등록된 모든 리스너에 preparing 이벤트를 전달합니다. 상호 작용에는 키보드 단축키를 사용한 메뉴 열기 또는 항목 선택 등이 포함됩니다.
참고: preparing 이벤트는 Adobe AIR 2.6 이상에서만 사용 가능합니다.
displaying:
메뉴가 표시되기 직전에 메뉴와 해당 메뉴 항목은 등록된 리스너에 displaying 이벤트를 전달합니다.

preparing displaying 이벤트를 사용하면 메뉴 내용 또는 항목 모양을 사용자에게 보여 주기 전에 업데이트할 수 있습니다. 예를 들어 “최근에 사용한 파일 열기” 메뉴의 displaying 이벤트에 대한 리스너에서 최근에 본 문서의 최신 목록을 반영하여 메뉴 항목을 변경할 수 있습니다.

키보드 단축키가 preparing 이벤트를 트리거한 메뉴 항목을 제거하면 해당되는 메뉴 상호 작용이 실질적으로 취소되고 select 이벤트가 전달되지 않습니다.

이벤트의 target currentTarget 속성은 모두 리스너가 등록되는 객체이며, 메뉴 자체 또는 메뉴 항목 중 하나가 됩니다.

preparing 이벤트는 displaying 이벤트에 앞서 전달됩니다. 일반적으로 두 이벤트는 한 번에 하나만 수신할 수 있습니다.

select:
사용자가 명령 항목을 선택하면 항목에서는 등록된 리스너에 select 이벤트를 전달합니다. 하위 메뉴와 분리 기호 항목은 선택할 수 없으므로 select 이벤트를 전달하지 않습니다.

select 이벤트는 메뉴 항목에서 이 항목을 포함하는 메뉴로, 최종적으로 루트 메뉴로 버블링됩니다. select 이벤트를 항목에서 직접 수신하거나 메뉴 구조의 상위에서 수신할 수 있습니다. select 이벤트를 메뉴에서 수신하는 경우 이벤트의 target 속성을 사용하여 선택한 항목을 식별할 수 있습니다. 이벤트가 메뉴 계층 구조에서 버블링될 때 이벤트 객체의 currentTarget 속성은 현재 메뉴 객체를 식별합니다.

참고: ContextMenu 및 ContextMenuItem 객체는 select , preparing displaying 이벤트뿐 아니라 menuItemSelect menuSelect 이벤트를 전달합니다.

기본 메뉴 명령에 해당하는 키(AIR)

메뉴 명령에 해당하는 키(엑셀러레이터라고도 함)를 할당할 수 있습니다. 이 키 또는 키 조합을 누르면 메뉴 항목에서는 등록된 리스너에 select 이벤트를 전달합니다. 항목을 포함하는 메뉴는 호출될 명령의 응용 프로그램 또는 활성 윈도우 메뉴에 포함되어 있어야 합니다.

해당하는 키는 기본 키를 나타내는 문자열과 함께 눌러야 하는 수정자 키 배열의 두 부분으로 이루어집니다. 기본 키를 할당하려면 메뉴 항목의 keyEquivalent 속성을 해당 키의 단일 문자열로 설정합니다. 대문자를 사용하는 경우 수정자 배열에 shift 키가 자동으로 추가됩니다.

Mac OS X에서는 기본 수정자가 Command 키( Keyboard.COMMAND )입니다. Windows 및 Linux에서는 Ctrl 키( Keyboard.CONTROL )입니다. 이러한 기본 키는 수정자 배열에 자동으로 추가됩니다. 다른 수정자 키를 할당하려면 원하는 키 코드가 포함된 새 배열을 keyEquivalentModifiers 속성에 추가합니다. 기본 배열은 덮어씁니다. 기본 수정자를 사용하거나 사용자 고유의 수정자 배열을 할당하면 keyEquivalent 속성에 할당하는 문자열이 대문자를 사용하는 경우 Shift 키가 추가됩니다. 수정자 키에 사용할 키 코드에 대한 상수는 Keyboard 클래스에서 정의합니다.

할당된 키 문자열이 메뉴 항목 이름 옆에 자동으로 표시됩니다. 형식은 사용자의 운영 체제 및 시스템 환경 설정에 따라 다릅니다.

참고: Keyboard.COMMAND 값을 Windows 운영 체제의 키 수정자 배열에 할당하면 해당하는 키가 메뉴에 표시되지 않습니다. 그러나 메뉴 명령을 활성화하려면 Crtl 키를 시용해야 합니다.

다음 예제에서는 메뉴 항목에 해당하는 키로 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에서는 메뉴나 명령의 첫 번째 문자나 두 문자를 입력한 다음 return 키를 누릅니다. mnemonicIndex 속성은 무시됩니다.

Windows에서는 단일 문자만 중요합니다. 기본적으로 중요한 문자는 레이블의 첫 번째 문자이지만 메뉴 항목에 니모닉을 할당하는 경우 지정하는 문자가 중요한 문자가 됩니다. 니모닉 할당 여부와 관계없이 메뉴의 두 항목이 중요한 문자가 동일한 경우 사용자 키보드와 메뉴의 상호 작용이 약간 변경됩니다. 이 경우 단일 문자를 눌러 메뉴나 명령을 선택하지 않고 문자를 필요한 만큼 여러 번 눌러 원하는 항목을 강조 표시한 다음 Enter 키를 눌러 선택을 완료해야 합니다. 일관된 비헤이비어를 유지하려면 윈도우 메뉴의 각 메뉴 항목에 고유한 니모닉을 할당하는 것이 좋습니다.

Linux에서는 기본 니모닉이 제공되지 않습니다. 니모닉을 제공하려면 mnemonicIndex 속성의 값을 지정해야 합니다.

니모닉 문자를 레이블 문자열에 대한 인덱스로 지정합니다. 레이블에서 첫 번째 문자의 인덱스는 0입니다. 따라서 “Format”이라는 메뉴 항목에 “r”을 니모닉으로 사용하려면 mnemonicIndex 속성을 2로 설정합니다.

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

메뉴 항목 상태

메뉴 항목에는 checked enabled 의 두 가지 상태 속성이 있습니다.

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 속성을 사용하여 각 항목에 있는 임의의 객체를 참조할 수 있습니다. 예를 들어 “Open Recent” 메뉴에서는 각 메뉴 항목에 각 문서의 File 객체를 할당할 수 있습니다.

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