通常,激活一個(gè)命令可以有多種方式,用戶可以通過(guò)菜單、擊鍵或工具欄上的按鈕選擇特定的功能。在AWT事件模型中實(shí)現(xiàn)這些非常容易:將所有事件 連接到同一個(gè)監(jiān)聽器上。例如:假設(shè)blueAction是一個(gè)動(dòng)作監(jiān)聽器,它的actionPerformed方法可以將背景顏色改變成藍(lán)色。將一個(gè)監(jiān)聽 器對(duì)象加到下面幾個(gè)事件源上:
·標(biāo)記為Blue的工具欄按鈕
·標(biāo)記為Blue的菜單項(xiàng)
·擊鍵CTRL+B
然后,無(wú)論改變背景顏色的命令是通過(guò)哪種方式下達(dá)的,是點(diǎn)擊按鈕、菜單選擇,還是按下鍵盤,其操作動(dòng)作都是一樣的。
Swing包提供了一種非常實(shí)用的機(jī)制來(lái)封裝命令,并將它們連接到多個(gè)事件源,這就是Action接口。一個(gè)動(dòng)作是一個(gè)封裝下列內(nèi)容的對(duì)象:
·命令的說(shuō)明(一個(gè)文本字符串和一個(gè)可選圖標(biāo));
執(zhí)行命令所需要的參數(shù)(例如,在列舉的例子中請(qǐng)求改變的顏色)。
一個(gè)方法是ActionListener接口中很熟悉的一個(gè):實(shí)際上,Action接口擴(kuò)展于ActionListener接口,因此,可以在任何需要ActionListener對(duì)象的地方使用Action對(duì)象。
接下來(lái)的兩個(gè)方法允許啟用或禁用這個(gè)動(dòng)作,并檢查這個(gè)動(dòng)作當(dāng)前是否啟用。當(dāng)一個(gè)連接到菜單或工具欄上的動(dòng)作被禁用時(shí),這個(gè)選項(xiàng)就會(huì)變成灰色。
putValue和getvalue方法允許存儲(chǔ)和檢索動(dòng)作對(duì)象中的任意名/值。有兩個(gè)重要的預(yù)定義字符串:Action.NAME和Action.sMALLjcON,用于將動(dòng)作的名字和圖標(biāo)存儲(chǔ)到一個(gè)動(dòng)作對(duì)象中。
如果動(dòng)作對(duì)象添加到菜單或工具欄上,它的名稱和圖標(biāo)就會(huì)被自動(dòng)地提取出來(lái),并顯示在菜單項(xiàng)或工具欄中。SHORT_DESCRiRTION值變成了工具提示。
Action接口的最后兩個(gè)方法能夠讓其他對(duì)象在動(dòng)作對(duì)象的屬性發(fā)生變化時(shí)得到通告,尤其是菜單或工具欄處罰的動(dòng)作。例如,如果增加一個(gè)菜單,作為動(dòng)作 對(duì)象的屬性變更監(jiān)聽器,而這個(gè)動(dòng)作對(duì)象隨后被禁用,菜單就會(huì)被調(diào)用,并將動(dòng)作名稱變?yōu)榛疑?。屬性變更監(jiān)聽器是一種常用的構(gòu)造形式,它是JavaBeans 組件模型的一部分。
需要注意,Action一個(gè)接口,而不是一個(gè)類。實(shí)現(xiàn)這個(gè)接口的所有類都必須實(shí) 現(xiàn)剛才討論的7個(gè)方法。慶幸的是,有一個(gè)類實(shí)現(xiàn)了這個(gè)接口除actionPerformed方法之外的所有方法,它就是AbstractAction個(gè)類 存儲(chǔ)了所有名/值對(duì),并管理著屬性變更監(jiān)聽器。我們可以直接擴(kuò)展AbstractAction類,并在擴(kuò)展類中實(shí)現(xiàn)actionPerformed方法。
構(gòu)造器讀取動(dòng)作的名稱和圖標(biāo),為工具提示設(shè)置簡(jiǎn)要說(shuō)明,將工作設(shè)置為監(jiān)聽器。
最后,想要將這個(gè)動(dòng)作對(duì)象添加到擊鍵中,以便讓用戶敲擊鍵盤命令來(lái)執(zhí)行這項(xiàng)動(dòng)作。為了將動(dòng)作與擊鍵關(guān)聯(lián)起來(lái),首先需要生成KeyStroke類對(duì)象。這 是一個(gè)很有用的類,它封裝了對(duì)鍵的說(shuō)明。要想生成一個(gè)Keystroke對(duì)象不要調(diào)用構(gòu)造器,而是調(diào)用KeyStroke類中的靜態(tài) getKeyStroke方法:
為了能夠理解下一個(gè)步驟,需要知道keyboardfocus的概 念。用戶界面中可以包含許多按鈕、菜單、滾動(dòng)欄以及其他的組件。當(dāng)用戶敲擊鍵盤時(shí),這個(gè)動(dòng)作會(huì)被發(fā)送給擁有焦點(diǎn)的組件。通常具有焦點(diǎn)的組件可以明顯地察覺 到(但并不總是這樣),例如,在Java觀感中,具有焦點(diǎn)的按鈕在按鈕文本周圍有一個(gè)細(xì)的矩形邊框。用戶可以使用TAB鍵在組件之間移動(dòng)焦點(diǎn)。當(dāng)按下 SPACE鍵時(shí),就點(diǎn)擊了擁有焦點(diǎn)的按鈕。還有一些鍵執(zhí)行一些其他的動(dòng)作,例如,按下箭頭鍵可以移動(dòng)滾動(dòng)條。
然而,在這里的示例中,并不希望將擊鍵發(fā)送給擁有焦點(diǎn)的組件。否則,每個(gè)按鈕都需要知道如何處理CTRL+Y、CTRL+B和CTRL+R這些組合鍵。
這是一個(gè)常見的問(wèn)題,Swing設(shè)計(jì)者給出了一種很便捷的
解決方案。每個(gè)JComponent有三個(gè)輸入映射(imput maps),每一個(gè)映射的KeyStroke對(duì)象都與動(dòng)作關(guān)聯(lián)。
網(wǎng)頁(yè)題目:網(wǎng)站建設(shè)核心之動(dòng)作處理
文章分享:http://www.rwnh.cn/news13/191663.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、微信小程序、云服務(wù)器、App開發(fā)、微信公眾號(hào)、品牌網(wǎng)站設(shè)計(jì)
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)