【正文】
盡管 SDK 之前的版本無(wú)法直接從 Action 構(gòu)造 JMenuItem,但是使用添加Action 到 JMenu或 JPopupMenu的方法可以達(dá)到同樣的效果 —— 菜單自會(huì)妥善創(chuàng)建并配置 JMenuItem。當(dāng)應(yīng)用程序需要中止某個(gè)當(dāng)前不適宜的操作時(shí),調(diào)用 Action實(shí)例的 setEnabled就會(huì)自動(dòng)將與該操作有關(guān)的用戶接口元素進(jìn)行全部更新(從而對(duì)菜單項(xiàng)和工具欄按扭不加區(qū)分)。 上述技巧在程序員希望用多種方 法(如分別用工具欄和菜單入手)調(diào)用同一個(gè)操作時(shí)尤其有效。最面向?qū)ο蟮姆椒ㄊ莿?chuàng)建一個(gè)專門的 Action 類,讓它應(yīng)對(duì)用戶可能向應(yīng)用程序提交的所有任務(wù),從而讓程序員把實(shí)現(xiàn)每個(gè)動(dòng)作的程序代碼與動(dòng)作的名稱、圖標(biāo)、按鍵及其他屬性 9 捆綁為一體。 另一種方法是,程序員給每個(gè)菜單項(xiàng)注冊(cè)一個(gè)獨(dú)立的 ActionListener 類,來(lái)判斷哪個(gè)菜單項(xiàng)被選中。這一操作將告知監(jiān)聽(tīng)器哪個(gè)菜單項(xiàng)已經(jīng)被單擊,并允許其進(jìn)行適當(dāng)回應(yīng)。鑒于菜單項(xiàng)從 AbstractButton 處繼承了ActionEvent 功能,因而一個(gè)可行的方法便是為每個(gè)菜單項(xiàng)賦予一個(gè)操作指令(這通常由指定組件自動(dòng)完成),并將所有菜單項(xiàng)連接到同一個(gè) ActionListener方法上。 ponent屬性返回一個(gè)對(duì) this的引用(即菜單欄本身), subElements 屬性返回由菜單欄中各個(gè)菜單組成的數(shù)組。ponentAtIndex屬性可訪問(wèn)與給定索引有關(guān)的菜單,它與被索引的 menu屬性相似,只是它的內(nèi)容被拋給一個(gè) Component 對(duì)象。請(qǐng)記住,單個(gè)選擇模型只允許每次激活一個(gè)菜單。其中, menu 屬性是一個(gè)索引屬性( indexed property),引用了每一個(gè)連接到菜單欄的 JMenu 對(duì)象。如果程序中還包含多重菜單欄,大概就更熱鬧了。但這樣就影響了外觀風(fēng)格在適當(dāng)?shù)臅r(shí)機(jī)給菜單欄妥善定位。由于都是 JComponent的子類,所以多重( multiple)菜單欄可以位于容器內(nèi)的任何位置。甚至還可以在不同的位置添加多個(gè)菜單欄。 ().add(menuBar, )。這意味著可以和其他 Swing 組件一樣,通過(guò) Swing 的布局管理器實(shí)現(xiàn)菜單欄定位。盡管這樣做增大了程序員的工作量,但為了給 Mac 用戶呈現(xiàn)一個(gè)親切、舒適的界面,多做點(diǎn)工作還是值得的。如果應(yīng)用程序的某個(gè)框架沒(méi)有菜單欄,那么,當(dāng)該窗口獲得輸入焦點(diǎn) 時(shí),菜單欄會(huì)立刻消失,讓用戶不知所措。但是,在默認(rèn)情況下此狀態(tài)是被禁止的,因?yàn)榇蠖鄶?shù) Java 程序并不期待出現(xiàn)這種情況,而且必須對(duì)程序適當(dāng)編碼才可處理該狀態(tài)。 如果應(yīng)用程序在 Macintosh上運(yùn)行,用戶可以設(shè)置其外觀風(fēng)格,按自己的意愿把菜單欄放到屏幕頂部。 JApplet和 JDialog 都包含 setJMenuBar()方法,這也就是說(shuō), applet 和對(duì)話框中都可以添加菜單欄。 7 這段程序中的 setJMenuBar()方法類似于 setMenuBar()方法。 JMenuBar menuBar = new JMenuBar()。 菜單欄布局 有兩種方法可以將菜單欄連接到 Swing 框架或 applet 上。程序員應(yīng)該讓某一個(gè)菜單被標(biāo)記為幫助菜單,但幫助菜單的位置由外觀風(fēng)格決定。 JMenuBar 便隨之分配一個(gè)整數(shù)索引,里面的菜單按照其加入索引的順序排列,而菜單欄則依照此索引內(nèi)容的順序從左至右顯示菜單。圖 144顯示了 JMenuBar組件的類層次結(jié)構(gòu)( class hierarchy)。 JMenuBar 類將 DefaultSingleSelectionModel用做自身的數(shù)據(jù)模型,因?yàn)橛脩粼谀骋粫r(shí)刻只能喚起( raise)或激活( activate)一個(gè)菜單。s not currently appropriate, calling setEnabled on the Action instance 5 automatically updates all user interface elements associated with the action (thus dimming both your menu item and toolbar button). Similarly, changing other attributes of the action, such as its name or icon, automatically updates any associated userinterface ponents. Although prior to SDK it wasn39。s text, image, accelerator, and so on. This technique is particularly powerful if you want to be able to invoke the same action in multiple way