ブラウザでダウンロード 動的なメニューはクラスが必要配列を用いて固定的なメニューを作成するのであれば、 定数として初期値を入れる形でも良いのですが、 やはり、クラスとして実装したほうが便利に感じます。 ( ここでは、最低限の機能しか実装していません ) MenuBlock.as
01. package { 02. 03. // ********************************************************* 04. // メニューのポップアップ単位を 05. // 1ブロックとして構築していくクラス 06. // ********************************************************* 07. public class MenuBlock { 08. public var block:Array = null ; 09. public function MenuBlock () { 10. block = new Array(); 11. } 12. 13. // ********************************************************* 14. // 最初に実行して、以後この文字列で識別する 15. // 名称を変更してもいいように、内部識別を作っても良い 16. // ********************************************************* 17. public function addItem( label:String ): void { 18. var obj:Object = new Object(); 19. obj[ "label" ] = label; 20. block.push(obj); 21. } 22. 23. // ********************************************************* 24. // セパレータ 25. // ********************************************************* 26. public function addSep( ): void { 27. var obj:Object = new Object(); 28. obj[ "type" ] = "separator" ; 29. block.push(obj); 30. } 31. 32. // ********************************************************* 33. // 階層を作成 34. // ********************************************************* 35. public function addChild( label:String, mb:MenuBlock ): void { 36. for ( var i: int ; i < block.length; i++ ) { 37. if ( block[i][ "label" ] == label ) { 38. block[i][ "children" ] = mb.block; 39. break ; 40. } 41. } 42. } 43. 44. // ********************************************************* 45. // アイコンをセット 46. // ********************************************************* 47. public function setIcon( label:String, icon:Class ): void { 48. for ( var i: int ; i < block.length; i++ ) { 49. if ( block[i][ "label" ] == label ) { 50. block[i][ "icon" ] = icon; 51. break ; 52. } 53. } 54. } 55. 56. // ********************************************************* 57. // その他のオプションをセット 58. // ********************************************************* 59. public function setOption( label:String, target:String, value:Object ): void { 60. for ( var i: int ; i < block.length; i++ ) { 61. if ( block[i][ "label" ] == label ) { 62. block[i][target] = value; 63. break ; 64. } 65. } 66. } 67. } 68. 69. } 以下が使用サンプルです 001. import mx.controls.*; 002. import mx.events.*; 003. import mx.formatters.*; 004. import flash.events.*; 005. 006. include "Parts.as" 007. // 画像の埋め込み 008. include "Icon.as" 009. 010. private var myMenuData:Array; // 配列仕立て 011. private var popupMenu1:Menu; 012. private var save:Object; 013. 014. // このウインドウ 015. private var me:Application = null ; 016. 017. // ********************************************************* 018. // アプリケーションの初期化 019. // ********************************************************* 020. public function initData(): void { 021. 022. firebug( "処理開始" ); 023. 024. me = this ; 025. 026. // ***************************************************** 027. // 配列仕立てのポップアップメニュー 028. // ***************************************************** 029. /* 030. myMenuData = 031. [ 032. {label: "ファイル" , icon: icon1, children:[ 033. {label: "開く", enabled: false } 034. ,{label: "保存", userOption: "001" } 035. ,{type: "separator" } 036. ,{label: "オプション" , children:[ 037. {label: "お気に入り", icon: iconFavorites } 038. ,{label: "情報", icon: iconInfoBox } 039. ,{label: "検索", icon: iconSearch } 040. ]} 041. ]} 042. , 043. {label: "背景処理" , icon: icon2, children:[ 044. {label: "背景変更", type: "check", toggled: true } 045. ,{type: "separator" } 046. ,{label: "ここを動的に変更", type: "check", toggled: true } 047. ]} 048. , 049. {label: "予備", icon: icon3 } 050. ]; 051. */ 052. 053. // 一番深い階層 054. var mb1:MenuBlock = new MenuBlock(); 055. mb1.addItem( "お気に入り" ); 056. mb1.setIcon( "お気に入り" ,iconFavorites); 057. mb1.addItem( "情報" ); 058. mb1.setIcon( "情報" ,iconInfoBox); 059. mb1.addItem( "検索" ); 060. mb1.setIcon( "検索" ,iconSearch); 061. 062. // 2番目の階層( A ) 063. var mb2A:MenuBlock = new MenuBlock(); 064. mb2A.addItem( "開く" ); 065. mb2A.setOption( "開く" , "enabled" , false ); 066. mb2A.addItem( "保存" ); 067. mb2A.setOption( "保存" , "userOption" , "001" ); 068. mb2A.addSep(); 069. mb2A.addItem( "オプション" ); 070. mb2A.addChild( "オプション" ,mb1); // 一番深い階層をリンク 071. 072. // 2番目の階層( B ) 073. var mb2B:MenuBlock = new MenuBlock(); 074. mb2B.addItem( "背景変更" ); 075. mb2B.setOption( "背景変更" , "type" , "check" ); 076. mb2B.setOption( "背景変更" , "toggled" , true ); 077. mb2B.addSep(); 078. mb2B.addItem( "ここを動的に変更" ); 079. mb2B.setOption( "ここを動的に変更" , "check" , true ); 080. 081. // 一番上の階層 082. var mb3:MenuBlock = new MenuBlock(); 083. mb3.addItem( "ファイル" ); 084. mb3.setIcon( "ファイル" ,icon1); 085. mb3.addChild( "ファイル" ,mb2A); // 下位階層をリンク 086. mb3.addItem( "背景処理" ); 087. mb3.setIcon( "背景処理" ,icon2); 088. mb3.addChild( "背景処理" ,mb2B); // 下位階層をリンク 089. mb3.addItem( "予備" ); 090. mb3.setIcon( "予備" ,icon3); 091. 092. 093. mb2B.addItem( "あとから追加" ); 094. 095. 096. popupMenu1 = Menu.createMenu( null , mb3.block, false ); 097. // 表示する内容を対応させる 098. popupMenu1.labelField = "label" ; 099. popupMenu1.iconField = "icon" ; 100. // イベントを登録 101. popupMenu1.addEventListener( "itemClick" , clickMenuHandler); 102. popupMenu1.addEventListener( "itemRollOver" , menuItemRollOver); 103. popupMenu1.addEventListener( "menuShow" , popupMenuCheck); 104. 105. popupMenu1.setStyle( "backgroundColor" , "0x000000" ); 106. popupMenu1.setStyle( "backgroundAlpha" , "0.2" ); 107. popupMenu1.setStyle( "backgroundImage" , imgMenuBackSmile ); 108. popupMenu1.setStyle( "backgroundSize" , "100%" ); 109. 110. } 111. 112. // ********************************************************* 113. // creationComplete 114. // ********************************************************* 115. private function initApp1(): void { 116. 117. } 118. 119. // ********************************************************* 120. // itemClick 121. // ********************************************************* 122. private function clickMenuHandler(e:MenuEvent): void { 123. 124. 125. } 126. 127. // ********************************************************* 128. // itemRollOver 129. // e.menu : マウスの下のメニュー 130. // ********************************************************* 131. private function menuItemRollOver(e:mx.events.MenuEvent ): void { 132. 133. } 134. 135. // ********************************************************* 136. // menuShow 137. // サブメニューが開かれた 138. // e.menu : 開かれたメニュー 139. // ********************************************************* 140. private function popupMenuCheck(e:mx.events.MenuEvent ): void { 141. 142. } |