《》我們常常會遇到這樣一個問題:很多組件都需要處理相同的事件 ; 比如,通常一個軟件在設計時會因用戶習慣,
產生不同的操作方式卻能達到相同的功能,例如文書編輯器中,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