路是爬出來的

          rcp實踐

                這篇文章基本上是沒怎么加我自己寫的代碼的,幾乎全部是eclipse生成的,本人只是拿這個例子來說說自己的認識,所以里面很多錯誤,看了就把它忘記吧。建議到網站找資料,我想更適合你。

          最近發現rcp的資料越來越多,而自己有處于比較有空的狀態,所想寫一篇完整的Rcp教程,由于我也是初學,所以寫出來的很多東西可能都是錯的,所以建議參考一些資料:


          http://www.eclipse.org/home/categories/rcp.php Eclipse Rcp的官方網站。


          http://www-128.ibm.com/developerworks/cn/opensource/top-projects/eclipse.html  IBM網站 Eclispe的幫助文檔。


          上面的文檔足以幫助我們這些初學者入門。


          <!--[if !supportEmptyParas]--> <!--[endif]-->


          下面我將以一篇管理用戶的例子來體驗RCP的美妙,此程序基于(jdk1.5+eclipse3.2)。


          一.創建序基本框架


          二.分析RCP的結構


          三.添加程序功能


          四.建立數據model,dao,service,action


          五.測試


          六.打包


          一.    序基本框架,我想Eclipse這點做的是很貼心的,在創建程序框架的時候選擇Email Template。并輸入項目名稱org.wuhua.rcp。然后點下一步就行了。這樣我們創建了帶菜單,工具條等基本模板。




          上面的模板我想基本上是適合我們的程序的,不過我們要改進下它們,比如菜單,工具條,跟左側樹狀菜單,這些是我們要改進的,我們要讓它們符合我們的需求。



          二.    哇,上面的框架好漂亮啊。Eclipse是怎么做出來的。程序是怎么啟動的?我怎么沒有找到main方法呢?java不是要求從main啟動的嗎?那些圖片,菜單,工具條,視圖是怎么構建的呢?跟Swing,awt有區別嗎?

          帶這這些問題我們來看看那些源代碼是怎么工作的?

          我們將三步來學習這些東西:

          1,    插件清單――plugin.xml,MANIFEST.MF(OSGI綁定),build.properties。

          2,    java代碼――Perspective,ActionBarAdvisor, WorkbenchAdvisor,Application


          <!--[if !supportLists]-->


          插件清單的學習:重點RCP程序也是一個插件,但跟插件又有點不同(它有自己獨立的工作臺,有自己獨立的透視圖,透視圖在程序啟動時候啟動(可以自己指定相關的透視圖實現)。要注意的是在相同的時間里只能存在一個透視圖),我認為普通插件是構建在Eclipse的工作臺之上的,說白了就是插件要依賴與Eclipse來工作,而RCP則可獨立運行――純粹個人觀點。


          在創建了插件項目之后,需要創建透視圖,創建透視圖是一個兩階段的過程。首先,修改插件的清單以包含新的擴展,該擴展將使用 org.eclipse.ui.perspectives 擴展點。其次,使用來自新擴展點的屬性創建一個透視圖類。根據關于擴展和擴展點的早期討論,AutoTest應用程序的插件清單已經包括下列擴展:


           


                   point="org.eclipse.ui.perspectives">


               


                      name="Autotest Perspective"


                      class="org.wuhua.autotest.ui.Perspective"


                      id="org.wuhua.autotest.perspective">


               


           




          元素具有下列屬性:



          • id —— 該屬性為透視圖定義了一個惟一標識符。

          • name —— 該屬性為透視圖定義了一個名稱,工作臺窗口菜單欄將使用它來表示該透視圖。

          • class —— 該屬性包含實現 org.eclipse.ui.IPerspectiveFactory 接口的類的完全限定名。



          上面是對透視圖插件清單的定義,現在我們看下,透視圖在java代碼中是怎么樣構建的,是怎么樣顯示到桌面?看看下面的代碼


          java 代碼


           


          1. public class Perspective implements IPerspectiveFactory {  

          2.     public void createInitialLayout(IPageLayout layout) {  

          3.     }  

          4. }  



          IperspectiveFactory指定一個創建透視圖接口,我們只需要實現它即可。程序會在啟動的時候加載這個類,具體是通過plugin.xml里面的擴展點:

          point="org.eclipse.ui.perspectives">――個人認為:我們可以把RCP啟動框架OSGI相當于Spring IOC容器,通過配置文件加載并管理各個方面的資源。


          <!--[if !supportEmptyParas]--> <!--[endif]-->


          具體創建透視圖的方法是:





          java 代碼


           


          1. public void createInitialLayout(IPageLayout layout) {  

          2.     String editorArea = layout.getEditorArea();  

          3.         layout.setEditorAreaVisible(false);  

          4.           

          5.         layout.addStandaloneView(NavigationView.ID,  false, IPageLayout.LEFT, 0.25f, editorArea);  

          6.         IFolderLayout folder = layout.createFolder("messages", IPageLayout.TOP, 0.5f, editorArea);  

          7.         folder.addPlaceholder(View.ID + ":*");  

          8.         folder.addView(View.ID);  

          9.           

          10.         layout.getViewLayout(NavigationView.ID).setCloseable(false);  

          11. }  



           



          我們可以在里面部署我們的透視圖,比如透視圖開始位置,大小,是否可見等――系統通過傳入IpageLayout 對象,然后通過這個對象來實現上面的功能。


          介紹 WorkbenchAdvisor


          前面集中討論了構成 RCP 應用程序的各種組件。接下來將集中討論如何將所有的事物結合到一起。在構建 RCP 應用程序時,核心任務之一就是創建一個實現抽象類 org.eclipse.ui.application.WorkbenchAdvisor 的類。WorkbenchAdvisor 類負責配置工作臺,當執行 RCP 應用程序時,將顯示該工作臺。


          WorkbenchAdvisor 類包含下列方法,從而為開發人員提供了對普通工作臺的生命周期的訪問:



          • initialize —— 應該在顯示任何窗口之前首先調用該方法。

          • preStartup —— 其次執行的就是這個方法,但它的調用是在第一個窗口打開之前。在啟動或者恢復期間暫時禁用某些項時,該方法非常有用。

          • postStartup —— 對該方法的調用是執行的第三個操作,它的調用是在第一個窗口打開之后,可以用該方法重新啟用 preStartup 方法中臨時禁用的項。

          • postRestore —— 該方法的調用是在已經根據以前保存的狀態重新創建工作臺及其窗口之后。

          • preShutdown ——該方法的調用是在事件循環已經終止,任何窗口尚未關閉之前。

          • postShutdown ——這是最后一個方法,它在事件循環終止之后被調用。


          WorkbenchAdvisor 類包含下列方法,以便為開發人員提供對工作臺窗口生命周期的訪問:



          • preWindowOpen —— 在打開每個窗口時調用該方法。

          • fillActionBars —— 在調用 preWindowOpen 方法之后調用該方法,可以使用它配置窗口的動作欄。

          • postWindowRestore —— 在根據以前保存的狀態重新創建窗口之后調用該方法。

          • postWindowOpen —— 在已經打開一個窗口之后調用該方法??梢允褂迷摲椒ㄗ匀魏未翱诒O聽器。

          • preWindowShellClose —— 在用戶關閉窗口外殼時調用該方法。


          WorkbenchAdvisor 類包含下列方法,以便為開發人員提供對工作臺事件循環的訪問。



          • eventLoopException —— 可以調用該方法處理事件循環崩潰的異常。

          • eventLoopIdle —— 在沒有更多的事件需要處理的時候調用該方法。


          <!--[if !supportEmptyParas]--> <!--[endif]-->


          WorkbenchAdvisor 是個非常重要的類,它負責配置整個工作臺,一個Rcp程序只能存在一個WorkbenchAdvisor(工作臺)實例,但可以存在多個WorkbenchWindowAdvisor實例(工作窗口,相當于打開新窗口)。


          現象來詳細看下WorkbenchWindowAdvisorWorkbenchAdvisor是通過創建WorkbenchWindowAdvisor來實現工作臺的配置的,當然也可以不這么做。它也可以自己創建。但我覺得通過WorkbenchWindowAdvisor創建更靈活而且給人感覺更舒服。


          ActionBarAdvisor 這個類是我們用來定制菜單,工具條等。它的方法解釋如下


          protected void makeActions(final IWorkbenchWindow window) {


           //在這里可以通過窗口來定制action,比如文件中的打開,關閉,推出等action。


          }


          protected void fillMenuBar(IMenuManager menuBar) {


            //定制菜單


          }


          <!--[if !supportEmptyParas]--> <!--[endif]-->


          Application Rcp核心類,根據API說明,此類是RCP啟動的Main類,里面的run方法相當于普通java程序的main方法。通常這個類是建立RCP應用程序生成,代碼結構基本不用去修改。


          java 代碼


           


          1. Display display = PlatformUI.createDisplay();  

          2.         try {  

          3.             int returnCode = PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());  

          4.             if (returnCode == PlatformUI.RETURN_RESTART) {  

          5.                 return IPlatformRunnable.EXIT_RESTART;  

          6.             }  

          7.             return IPlatformRunnable.EXIT_OK;  

          8.         } finally {  

          9.             display.dispose();  

          10.         }  





          我們可以很清楚的知道,線程會在PlatformUI.createAndRunWorkbench(display, new ApplicationWorkbenchAdvisor());這里不挺的運行,直到程序崩潰或者用戶退出才會返回。


          <!--[if !supportEmptyParas]--> <!--[endif]-->


          恩。我想我基本上知道rcp是怎么運行的了,我對主管說?


          那好啊。你總結下,它是怎么運行的。


          首先通過plugin.xml文件配置rcp的各個方面,比如擴展點,需求包等。這個文件就好像spring的bean配置文件,告訴了容器上下文。


          “我說的對不對啊,主管。”我跟主管說。


          “那MANIFEST.MF這個文件的用途是什么呢?”主管說。


          我查查啊。噢,原來是跟OSGI有關的啊,在xx版本的esplise以前,plugin.xml做了全部工作,后來改進了。把一些工作放到MANIFEST.MF這個文件來了。我想它主要對OSGI框架運行的元數據包裝吧,比如定義RCP的運行環境跟依賴項目(有可能是插件)。


          <!--[if !supportEmptyParas]--> <!--[endif]-->


          對了我們基本上算是了解了RCP的一些基本只是,我現在想了解下,我點擊那些菜單的時候為什么會有反映的,它是怎么做到的?


          那么我們試驗下吧。經過查找API我們發現了Iaction,字面上怎么跟webwork的action差不多啊。因為根據名稱我們知道action具體是做什么的。它也是一個Command模式的經典應用嗎?


          我想是的??纯此姆椒?span lang='EN-US'>


          java 代碼


           


          1. public void run() {  

          2.         MessageDialog.openInformation(window.getShell(), "Open""Open Message Dialog!");  

          3.     }  

          4. }  






          這就更清楚了。我們只要繼承Action并覆蓋它的run方法就可以實現點擊的動作了。哈哈。Eclispe我太喜歡你了,


          好我們自己來定義實現一個Action吧。





          java 代碼


           


          1. public class MessagePopupAction extends Action {  

          2.   

          3.     private final IWorkbenchWindow window;  

          4.   

          5.     MessagePopupAction(String text, IWorkbenchWindow window) {  

          6.         super(text);  

          7.         this.window = window;  

          8.         // The id is used to refer to the action in a menu or toolbar  

          9.         setId(ICommandIds.CMD_OPEN_MESSAGE);  

          10.         // Associate the action with a pre-defined command, to allow key bindings.  

          11.         setActionDefinitionId(ICommandIds.CMD_OPEN_MESSAGE);  

          12.         setImageDescriptor(org.wuhua.rcp.Activator.getImageDescriptor("/icons/sample3.gif"));  

          13.     }  

          14.   

          15.     public void run() {  

          16.         MessageDialog.openInformation(window.getShell(), "Open""Open Message Dialog!");  

          17.     }  

          18. }  



           


          上面只是我對rcp一點認識,如果要想設計好rcp我覺得除了對這些基本知識要有了解外,對swt/jface也是要有充分的認識的。

          posted on 2006-12-30 09:06 路是爬出來的 閱讀(295) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 抚远县| 武城县| 新源县| 水富县| 荔浦县| 青浦区| 吉林省| 色达县| 杨浦区| 湖南省| 牟定县| 尤溪县| 合山市| 大渡口区| 碌曲县| 曲阳县| 绥中县| 富裕县| 邯郸县| 通州区| 察雅县| 乐业县| 连城县| 富裕县| 仁怀市| 锦屏县| 江都市| 广平县| 南雄市| 玉田县| 大关县| 承德县| 霍山县| 民勤县| 仙游县| 阳信县| 平武县| 合山市| 唐山市| 六安市| 湘潭市|