Java — Action接口的使用


《》我們常常會遇到這樣一個問題:很多組件都需要處理相同的事件 ; 比如,通常一個軟件在設計時會因用戶習慣,

產生不同的操作方式卻能達到相同的功能,例如文書編輯器中,copy功能可能在菜單中出現,

也可能在工具欄上出現,甚至在快顯菜單(Popup Menu)中出現,雖然出現的方式不一樣,

但均能達到copy的功能.若以我們之前的事件處理方法,我們必須為每種出現方式實現copy功能,

造成程序代碼重復性太高,不易閱讀也不美觀。現在我們就有這樣一個處理方法——使用Action接口

《》Action從表面的意思上就是“動作、行為” , 也就說一個實現Action接口的對象,本身就是一種業務,就是一種

處理功能,我們可以使用這個業務對象來創建不同的組件(如普通按鈕、菜單項、工具欄按鈕等),這樣的話這些組件

就都有相同的功能了

《》下面就來詳細的介紹Action接口的用法

1、Action接口是ActionListener接口的子接口,它除了包含ActionListener接口的actionPerformed()方法之外,

還含有name和icon兩個屬性,其中name用於指定創建的按鈕或者菜單項的文本標簽,icon則用於指定按鈕的圖標或者

菜單項中的圖標。也就是說,Action接口將“事件監聽”和“可被轉換成按鈕和菜單項”集於一身,這恰好說明了上面所說的

功能

2、實際上在JButton的構造方法 public JButton(Action action )中、JToolBar的add(Action action) 、以及JMenu的

add(Action action )方法中都可以看出,他們都能夠使用Action對象為參數,將Action自動的轉化為按鈕或者菜單項,你要做的

僅僅是定義一個Action對象,之后僅僅需要調用上面的方法就能夠自動的將Action轉化成組件了

3、就像上面說的那樣,Action本身並不是組件,只有應用JButton的構造方法或者將Action添加到指定的組件容器中(JToolBar或者JMenu)

才能夠將值轉化成組件

4、總結上面的各項我們可以得出,接收Action的容器(或者JButton)需要完成以下幾項工作:

①使用add方法添加Action對象

②根據Action對象中的name和icon屬性,自動的創建按鈕或者菜單項

③通過Action對象為應用組件注冊事件監聽器,系統會為該Action所創建的所有的組件注冊同一個事件監聽器

(事件處理器就是Action對象里的actionPerformed()方法)

④在Action接口中還有一個setEnabled(boolean)方法,這個方法用來指定當前的Action動作是否被激活,

只有一個Action動作被激活后,相應的組件才能夠使用③中的監聽器來處理業務,這是為什么呢?比如:我們創建了

“復制”“粘貼”兩項Action業務的話,那么只有當復制完成后,“粘貼”業務才可以被激活,否則“粘貼”業務默認

應該是不被激活的

《》好了,基本的邏輯搞清楚之后,那么下面就是如何創建一個Action對象了,一般我們並不是直接通過創建一個

實現Action接口的類,之后在通過這個類來創建Action類型的對象,而是創建一個實現AbstractAction抽象類的類;

這個抽象類AbstractAction實現了Action接口,而且這個抽象類,除了actionPerformed()方法之外,

已經將Action中包括setEnabled(boolean)在內的所有方法都實現了,這樣一來我們就能夠直接使用setEnabled()

等游泳的方法了;好了這樣一來AbstractAction抽象類中只有actionPerformed()方法沒有實現,這個方法應該在

創建的那個實現了AbstractAction類的類中實現;所以創建一個Action對象的過程如下:

①創建一個類(設為b類),讓這個類繼承AbstractAction抽象類

②創建b類的構造方法,為AbstractAction中的name和icon屬性賦值

(AbstractAction抽象類中有構造方法 public AbstractAction(String name,Icon icon)

③在b類中實現actionPerformed()方法,在些業務處理時,要注意是要將某些其他的業務激活或者關閉

《》這樣一來一切就都非常的清楚了,具體的實例可以參見《瘋狂Java講義》P454

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM