Action 雖然不是什麼很特別的技巧,但是它被廣泛地應用在 Java Swing 的套件之中。我寫過許多程式語言,Java Swing Action 是我覺得 Java 當中相當經典的設計。
NetBeans 的 Action 也是因循著 Java Swing 的傳統,將它用在 Menu 、Tool Bar
或是一些單一動作的功能上。只不過,NetBeans 是一個平台,它所提供的功能也相當複雜,所以,它在 Action 上的支援比起 Java
Swing 更豐富許多。我有在 NetBeans 的網站上找到一篇文章是專門介紹 Action ,若大家能接受英文的文件的話,可以參考一下– Actions API。
本文章會簡單的介紹一下 NetBeans 中的各種 Action ,這部份將會與 NetBeans 上的文章類似(畢盡 NetBeans 中的
Action 也就只有那幾種而已嘛)。另外,在往後的幾篇文章之中,將會一一地介紹如何設計每一種 Action 。
1. NetBeans 的 Actions
NetBeans 雖然利用了 Java 常見的 Action 功能,但是 Java Swing 的 Action 並不能滿足一個平台的需求。相信有自己開發過 RCP 平台的人都會知道這個事實。所以,NetBeans 就建立了許多不同種類的 SystemAction 來提供更多種類的應用,例如:僅提供介面的 Action 、有執行條件的 Action 。他們這樣的設計,將可以替使用 NetBeans 來開發系統的人省下不少功夫。
NetBeans 中會用到的 Actions 共分成:Java Swing Action、CallableSystemAction、CallbackSystemAction 、NodeAction、CookieAction ,五種。另外,除了這五個 Action Class 外,NetBeans 還提供建立使用者介面的 Interface 、與一些常用的小功具,在之後的內容中也會一一介紹。
2. Action 種類的介紹
a. Java Swing Action
這個類型的 Action 常被用在 TopComponent 的 getActions()
與 Node 的 getActions(boolean context)
方法之中。在早期的 NetBeans 的設計當中,這部份是使用 SystemAction 而非 Java Swing Action 。但在
3.x 版後,就通通改成 Java Swing Action 了。 NetBeans 的 TopComponent 與 Node 所提供的
Java Swing Action 將不會有任何的 Semantic 上的限制,或功能上的支援。所以大家僅須依照傳統設計 Java Swing
Action 的方式來設計就可以了。
b. CallableSystemAction
這類型的 Action 常被用在 Main Menu 、 Tool Bar 、Popup Menu 之中,一般可以用它來提供 Main Menu 、Tool Bar 、或 Popup Menu 的使用者介面 (這是因為它實作了Presenter
底下的介面)。另外,CallableSystemAction 的 enable state 是由 CallableSystemAction
自己維護的,所以在實作這個類別的時候,必須注意到何時要 enable 及何時要 disable ,不然所建立出來的介面將會是 always
enable 的哦。一般來說,我們會使用 CallableSystemAction 來設計非常獨立且與別人沒有任何關係的功能,例如:
about 、memory usage 等等。如此一來,又可以提供特殊的使用者介面,又可以讓它 always enable 。
大家可能覺
得很奇怪,這種 Action 明明就是介面,跟傳統的 Java Swing Action 差異很大。一般傳統的 Java Swing
Action 可以不理會呼叫它的使用者介面是什麼,就可以正常執行想要的功能就。但是, CallableSystemAction
反倒很關心使用者介面是什麼。其實這是 NetBeans 中相當有彈性的擴充設計。早期,筆者在開發自己的 RCP 平台時曾經遇到以下的問題:一個
Action 有想要的使用者介面該怎麼辦?因為不是每個 Action 都能接受 menu bar 或是 JButton ,它們可能會想用
JComboBox 或是其它各式各樣的使用者介面。 NetBeans 的開發者也是遇到了類似的問題,所以就設計了Presenter
,並用它來提供各種不同的使用者介面,這部份將會在之後的章節中有更詳細的介紹。另外,雖然 NetBeans 設計了 Presenter
可以解決這個問題,但是每次實作 Action 時都要實作 Presenter 實在太麻煩了。所以 NetBeans 設計了
CallableSystemAction 提供預設的實作。在 Presenter 的 javadoc
中有提到,一般人要提供使用者介面的時候,大多都會實作 CallableSystemAction 哦。
c. CallbackSystemAction
大家可能會發現 CallbackSystemAction 本身是繼承 CallableSystemAction
,所以它本身也可以提供使用者介面。比較特殊的地方是,CallbackSystemAction 本身僅是一個提供使用者介面的 Action
,而且,NetBeans 並不建議實作 Action 的程式碼,因為它並不會被呼叫到。說到這裡,大家可能會很驚訝,居然有不會被呼叫到的
Action 。NetBeans 這樣的設計也是有它的故事的。當初,筆者在設計自己的 RCP
平台的時候也曾經遇到這個問題:某些使用者介面,它會隨著 focused window 的變化,而希望有不同的 semantic ,就例如
Copy、Cut 、Paste 在 text-based 的 window 當中是對文字進行動作,但是在 file-based 的
window 中則是對檔案進行移動、複製的行為,可是在 RCP 中 Copy 、Cut 、Paste 的 tool bar 與 menu
bar 都只有一個,這時 RCP 就要隨著 focused window 的變化而掛載不同的 Action 。NetBeans 設計了 ContextAwareAction 就是用來解決這個問題。同樣地, NetBeans
的開發者為了簡化系統的實作,他們設計了 CallbackSystemAction 來處理這類的問題。在
CallbackSystemAction 中,它會替我們維護不同 focused window 的 action binding ,我們僅須在
focused window 當中提供對應的 ActionMap 物皁即可。另外,NetBeans 中一些常見的使用者介面也是利用
CallbackSystemAction 實作出來的,例如: Copy、Cut、Paste、Delete、Find、Print …等。
d. NodeAction
NodeAction 故名思意可以知道它是跟 Node 有關的 Action 。關於 Node 的部份,請參考本站與 Node 有關的資訊,這裡就不再多加介紹。
NodeAction 的用法將完全與先前介紹的三種 Action 不同,它可以視為具備執行條件的 Action
,當它的執行條件滿足時,它才能夠被執行。NodeAction 的執行條件其實就是檢查目前 focused window 所能提供的 Node
是否滿足它內部的需求。當 focused window 改變或它提供的 Node 改變時,NodeAction 的 enable(Node[] activatedNodes)
方法就會被乎叫,以用來判斷它的執行條件是否滿足,如果滿足的話,它所對應的使用者介面就會被啟用。
NetBeans 中有不少介面是使用 NodeAction ,例如:New、…等。
e. CookieAction
CookieAction 是繼承 NodeAction 而來,它本身也是提供執行條件的 Action ,只是它不像 NodeAction 的執行條件是跟 Node 有關,它的執行條件與Node.Cookie
有關。CookieAction 通常實作的時候,除了實作 Action 本身的方法外,還會實作一個 Cookie 的 interface
出來,以讓 focused window 能夠提供執行的資訊。例如 NetBeans 中的 SaveAction 就是一個
CookieAction ,它也提供了一個 SaveCookie 的 interface ,當我們有文件要提供儲存的時候,只要實作一個
SaveCookie 並將它放到正確的物件中,SaveAction 就會被啟用。
NodeAction 與 CookieAction 同樣都是具備執行條件的 Action ,但是 CookieAction 的彈性遠比
NodeAction 大上許多,所以 NetBeans 的很多功能都是用 CookieAction
所實作出來,例如:Save、Open、Edit、Print …等。
NodeAction 與 CookieAction 的功能其實很強大,在還沒接觸使用它之前,大家可能無法體會它的應用。但是,在往後的文章中,將會一一使用到它們,到時,我們就更能體會它的強大了。
3. NetBeans 與 Action 有關的工具
NetBeans 開發多年,許多我們在設計 Action 時覺得很麻煩的小地方,例如設定 mnemonic 、icon …等,他們都已經設計的很完全了。以下將介紹幾個常用的且與 Action 有關的工具:
a. Actions
Actions 可以用來連結一個使用者介面與 Action 。
JPopupMenuUtils 可以在一個 JPopupMenu 已經顯示後動態地新增一個項目,另外,它也能保證一個 JPopupMenu 顯示時,不會跑出整個電腦的螢幕外面。
c. Mnemonics
Mnemonics 是筆者非常常用的一個類別,它可以用來對 AbstractButton 、Label 建立 Mnemonic
,它的用法就跟開發 VB 、或其它 MS-Windows AP 的 menu 一樣,只須加上個『 & 』符號,它就會將之後的字元設定成
Mnemonic ,同時把文字設定上去。例如Save &As 就會被顯示成 Save As
本篇文章介紹了 NetBeans 的 Action 種類與一些常用的工具,在往後的文章當中,將會經常使用到這篇文章中所介紹到的工具或 Action 。