Eclipse RCP應用系統開發方法與實戰1– RCP基本架構(自己覺得有用作為參考)

來源:互聯網
上載者:User
文章目錄
  • 5.1.3 RCP基本架構
[轉]Eclipse RCP應用系統開發方法與實戰1-- RCP基本架構
5.1.3 RCP基本架構一個基本的RCP應用程式已經搭建起來,儘管還非常稚嫩,卻已經初具雛形。探究一下RCP的基本架構對於理解RCP大有好處。從前面圖5-6可以看
出,Eclipse已經自動產生了Application.java、ApplicationActionBarAdvisor.java、
ApplicationWorkbenchAdvisor.java、ApplicationWorkbench-
WindowAdvisor.java、Perspective.java這5個類檔案。有必要對這5個檔案進行分析,以便更深刻地理解RCP的基本框
架。在分析之前,先來簡單理解一下幾個基本概念。1.基本概念(1)Display應用程式一般只需要一個Display對象,該對象實際上是一個SWT對象,代表了底層圖
形系統的實現。Display的主要任務是事件處理,它負責從作業系統的事件隊列中讀取事件,傳遞給RCP的事件監聽器以便完成具體的任務。需要注意的
是,Display對象不代表應用程式視窗的任何可視控制項,在應用程式主視窗開啟之前,Display是不可獲得的。應用程式主視窗開啟之後,才可以通過
一個被稱作Shell的對象獲得。Display對象的獲得方法如下。Display display = new Display();或者:Display display=Display.getCurrent();(2)Shell每一個視窗都有一個Shell對象。Shell對象代表了與使用者互動的視窗架構,並處理與視窗關聯的諸如移動、改變大小等常見行為。Shell對象的獲得方法:Display display=Display.getCurrent();Shell shell = new Shell(display);或者:Shell shell=Display.getCurrent().getActiveShell();(3)WorkbenchWorkbench是工作台,通俗地說就是代表使用者介面的UI元素。工作台上有各種視窗、表徵圖、按鈕和控制項,使用者可以在工作台上做各種操作。獲得工作台對象的方法:IWorkbench wb=PlatformUI.getWorkbench();工作台對象有兩個方法也許很有用:l   wb.restart(),關閉應用程式並立即重新啟動。l   wb.close(),正常關閉應用程式,等同於ActionFactory.QUIT_ACTION。(4)AdvisorAdvisor是建議者,使用者主介面寬度、高度、表徵圖、菜單、工具列、顏色、操作等等配置方案需要Advisor來提出“建議”。Eclipse提供了3種類型的Advisor:l   WorkbenchAdvisor。應用程式層級,Eclipse3.0開始引入的全新類。每一個應用程式只有一個
Workbench,WorkbenchAdvisor負責該工作台生命週期的管理,例如啟動、關閉工作。WorkbenchAdvisor也負責該
Workbench的異常處理,並負責向Workbench提供一些重要參數,例如可以指定該Workbench的初始透視圖。l   WorkbenchWindowAdvisor。視窗層級。每一個視窗都有一個WorkbenchWindow- Advisor
執行個體。WorkbenchWindowAdvisor
負責具體視窗生命週期的管理,例如狀態列、工具列、菜單、視窗標題、視窗大小和各種控制項等等,也可以處理視窗的各種事件常式。l   ActionBarAdvisor。視窗層級。每一個視窗都有一個ActionBarAdvisor執行個體。ActionBarAdvisor負責管理視窗的功能表列、狀態列、工具列的外觀和行為。(5)View和Editor在Eclipse
RCP應用程式中,使用者主要通過視圖(View)和編輯器(Editor)來與程式互動。視圖是可以浮動的工作視窗,負責顯示資料在某個層面的狀態資訊。
編輯器也是一種工作視窗,提供對資料進行各種操作的互動能力。至於是使用視圖還是使用編輯器,沒有很嚴格的區分,取決於開發人員和使用者需求的考慮,例如,應
用程式的介面可以毫無障礙地全部使用視圖來實現。經費測算系統只有公用參數設定功能模組使用編輯器實現,其他大部分介面均採用視圖來實現。視圖擴充自ViewPart抽象類別。開發人員通常需要在createPartControl()方法中編寫代碼,以便構建視圖的介面元素。下面是一個沒有任何處理代碼的簡單視圖。package cn.edu.jfcs.ui;import org.eclipse.swt.widgets.Composite;import org.eclipse.ui.part.ViewPart;public class TeachUnitName extends ViewPart {     public TeachUnitName() {         // TODO Auto-generated constructor stub     }     public void createPartControl(Composite parent) {         // TODO Auto-generated method stub     }     public void setFocus() {         // TODO Auto-generated method stub     }}(6)PerspectivePerspective與視圖、編輯器之間的關係類似於書包和書、筆的關係。書包裡面可以放各種書和筆,書包是Perspective,而書和筆則
類似於視圖和編輯器。Perspective被稱之為透視圖,RCP應用程式是通過透視圖對視窗內容進行安排和布局的,應用程式都有一個預設的透視圖,每
個工作台視窗則可以包含一個或多個透視圖,同時使用者可向透視圖中添加其他UI介面元素。預設透視圖被設定為固定的,不能移動,而且沒有標題列。例如運行經
費測算系統後,單擊【Help】→【Welcome】,將在預設透視圖中開啟Welcome歡迎介面。關閉該歡迎介面,就會顯示一個沒有標題列、只有最小
化最大化按鈕的空介面,該介面即為預設的透視圖。透視圖需要實現IPerspectiveFactory介面。IPerspectiveFactory可以說是產生初始頁面配置和可視性透視圖的工
廠。在Eclipse中,工作台開啟的任何新頁面都需要一個透視圖定義其初始布局。具體說來,就是需要向透視圖工廠傳遞一個IPageLayout對象,
通過該對象安排視圖或者編輯器的初始布局。預設情況下,初始布局包含了一個可視的編輯區。當然,該編輯區也可以關閉。2.類檔案分析(1)Application.java對於普通Java應用程式來說,總是有一個main()方法,應用程式總是從main()開始運行。Application類似於Java應用程式
的main(),即RCP應用程式運行開始於Application,Application是RCP應用程式的入口。Application實現了
IPlatformRunnable介面,在RCP啟動的時候將會執行該介面的run()方法。從plugin.xml可以獲知,Application
實際上是Eclipse
org.eclipse.core.runtime.applications運行時擴充點的一個入口。Application主要代碼如下:cn.edu.jfcs.app/Application.javaimport …public class Application implements IPlatformRunnable {     public Object run(Object args) throws Exception {         Display display = PlatformUI.createDisplay();         try {              int returnCode = PlatformUI.createAndRunWorkbench(display,                                 new ApplicationWorkbenchAdvisor());              if (returnCode == PlatformUI.RETURN_RESTART) {                   return IPlatformRunnable.EXIT_RESTART;              }              return IPlatformRunnable.EXIT_OK;         } finally {              display.dispose();         }     }}可以把Application當作RCP應用程式的控制者,它負責應用程式的啟動、停止。Application首先建立一個Display對象,
然後調用PlatformUI.createAndRunWorkbench()方法啟動工作台,這將開啟應用程式主視窗,並處於持續開啟狀態。應用程式
開始處理使用者的按一下滑鼠、滑鼠移動、按鍵等各種事件,一直到使用者關閉程式退出,這就是所謂的事件迴圈。當然,在關閉之前,必須銷毀Display對象以釋
放資源(display.dispose())。從上面的分析可以得到這樣一個資訊:應用程式主視窗只有在語句“int returnCode =
PlatformUI.createAndRunWorkbench(display, new
ApplicationWorkbenchAdvisor());”調用之後才會開啟並可視化。開發人員可以利用這一點做做文章,例如在其前面加入啟動登
錄視窗、啟動Derby資料庫伺服器、初始化處理等等工作,代碼類似於下面的形式。……//啟動Derby資料庫伺服器//開啟登入介面int returnCode = PlatformUI.createAndRunWorkbench(display,                   new ApplicationWorkbenchAdvisor());if (returnCode == PlatformUI.RETURN_RESTART) {     return IPlatformRunnable.EXIT_RESTART;}……第6章中的實現使用者登入處理,就是基於這種處理思路。注意到PlatformUI.createAndRun-
Workbench()方法中,除了display對象,還向其傳遞了另外一個對象:new Application-
WorkbenchAdvisor(),那麼ApplicationWorkbenchAdvisor又是做什麼的?(2)ApplicationWorkbenchAdvisor.javaApplicationWorkbenchAdvisor類負責應用程式生命週期管理,繼
承自WorkbenchAdvisor類。開發人員可以在該類中實現程式啟動或者關閉時的某種處理。該類的具體實現只是給使用者一個初始的視圖介面而已,還
需要配合WorkbenchWindowAdvisor、ActionBarAdvisor才能構成一個較為完整的使用者介面。
ApplicationWorkbenchAdvisor類主要有5個重要的方法,按照執行的先後順序排列如表5-1所示。表5-1 ApplicationWorkbenchAdvisor主要方法
方 法 名 方 法 說 明
initialize 最先調用。在視窗開啟之前調用,可以用來處理初始化配置工作
preStartup initialize之後、第一個視窗開啟之前調用,可以用來處理臨時或者可選處理工作
postStartup 第一個視窗開啟之後但啟動事件迴圈之前調用,可以用來進行那些需要自動處理的工作,例如彈出一個提示視窗
preShutdown 事件迴圈結束之後但視窗關閉之前調用,可以用來進行儲存資料、關閉資料庫伺服器等處理工作
postShutdown 視窗關閉之後調用,可以用來進行儲存應用程式狀態、清除initialize建立的對象等處理工作
ApplicationWorkbenchAdvisor.java主要代碼如下。cn.edu.jfcs.app/ ApplicationWorkbenchAdvisor.javaimport …public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {     private static final String PERSPECTIVE_ID = "cn.edu.jfcs.perspective";     public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(              IWorkbenchWindowConfigurer configurer) {         return new ApplicationWorkbenchWindowAdvisor(configurer);     }     public void initialize(IWorkbenchConfigurer configurer) {         super.initialize(configurer);         configurer.setSaveAndRestore(true);     }     public String getInitialWindowPerspectiveId() {         return PERSPECTIVE_ID;     }}上述程式主要做了兩件事情:一是初始化需要在主介面顯示的透視圖
(Perspective),建立並返回ApplicationWorkbenchWindowAdvisor對象。二是初始化方法中代碼
configurer.setSaveAndRestore(true)用於設定應用程式每次退出時儲存當前視窗狀態,並在下次啟動時應用,這對應用程式
效能稍有影響,建議修改為false不儲存。getInitialWindowPerspectiveId()方法開啟預設的透視圖
cn.edu.jfcs.perspective。
如果在初始化initialize事件中編寫大量處理代碼,會引起應用程式啟動時主視窗的延遲顯示,給使用者以系統速度較慢的感覺。因此,應該盡量避免。
(3)ApplicationWorkbenchWindowAdvisor.javaApplicationWorkbenchWindowAdvisor類負責應用程式視窗
生命週期的管理,該類擴充自WorkbenchWindowAdvisor。每一個應用程式都需要一個WorkbenchWindowAdvisor來控
制視窗介面的UI元素。開發人員可以控制視窗建立時的大小、標題、位置等等,也可以添加建立、開啟、還原或關閉工作台視窗時調用的方法。
ApplicationWorkbenchWindowAdvisor主要方法如表5-2所示。表5-2 ApplicationWorkbenchWindowAdvisor主要方法
方 法 名 方 法 說 明
preWindowOpen 視窗控制項建立之前調用,可以在該方法中設定視窗的初始大小、狀態列、工具列等的可視性
postWindowRestore 當視窗根據上一次的儲存狀態恢複建立之後調用,可以用來調整調整視窗恢複狀態
postWindowCreate 視窗建立之後調用,可以用於調整視窗
postWindowOpen 視窗已經開啟之後調用,可以用來註冊視窗監聽,例如在此方法中實現系統托盤
下面我們來看看Eclipse自動產生的ApplicationWorkbenchWindowAdvisor.java主要代碼如下:cn.edu.jfcs.app/ ApplicationWorkbenchWindowAdvisor.javaimport …public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {    public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {        super(configurer);    }   public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {        return new ApplicationActionBarAdvisor(configurer);    }    public void preWindowOpen() {        IWorkbenchWindowConfigurer configurer = getWindowConfigurer();        configurer.setInitialSize(new Point(700, 550));    //定義視窗初始化大小        configurer.setShowCoolBar(false);                  //不顯示工具列        configurer.setShowStatusLine(false);          //不顯示狀態列        configurer.setTitle("jfcs");                       //視窗標題為jfcs    }}該類建立了一個ApplicationActionBarAdvisor對象,並通過preWindowOpen()方法方法配置視窗。在
preWindowOpen()方法中,首先產生了configurer對象,通過該對象配置視窗的大小、工具列、狀態列、標題等可視化元素,也就是說控
制視窗的外觀。預設狀態下工具列和狀態列都是隱藏的。IWorkbenchWindowConfigurer是一個介面類,該介面類提供了很多
set/get方法以便使用者訪問存取工作台視窗的配置。實際上,大家可能也注意到了,每種類型的Advisor都有一個對應的configurer。
ApplicationWorkbenchAdvisor中的IWorkbenchConfigurer、
ApplicationWorkbenchWindowAdvisor中的IWorkbenchWindowConfigurer、後面
Application-
ActionBarAdvisor中的IActionBarConfigurer,configurer是與工作台、視窗、菜單、工具列和狀態列打交道的
一座方便的橋樑。(4)ApplicationActionBarAdvisor.javaApplicationActionBarAdvisor.java類負責定義視窗的行為,該類擴充自ActionBarAdvisor。具體地
說,該類用於構建功能表列、工具列和狀態行。ActionBarAdvisor自然是負責功能表列、工具列和狀態行的建立和註冊。
ApplicationActionBarAdvisor主要方法如表5-3所示。表5-3 ApplicationActionBarAdvisor主要方法
方 法 名 方 法 說 明
void makeActions(IWorkbenchWindow window) 註冊菜單或者工具列的動作
void fillMenuBar(IMenuManager menuBar) 添加功能表列
void fillCoolBar(ICoolBarManager coolBar) 添加工具列
void fillStatusLine(IStatusLineManager statusLine) 添加狀態列
ApplicationActionBarAdvisor.java主要代碼如下。cn.edu.jfcs.app/ ApplicationActionBarAdvisor.javaimport …public class ApplicationActionBarAdvisor extends ActionBarAdvisor {    private IWorkbenchAction introAction;     public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {         super(configurer);     }     protected void makeActions(IWorkbenchWindow window) {         //利用ActionFactory動作工廠建立introAction         introAction = ActionFactory.INTRO.create(window);         register(introAction);     }     protected void fillMenuBar(IMenuManager menuBar) {         MenuManager helpMenu = new MenuManager("&Help",                                 IWorkbenchActionConstants.M_HELP);         menuBar.add(helpMenu);         helpMenu.add(introAction);     }}該程式建立了一個協助功能表列,其子功能表所執行的動作採用Eclipse內建的ActionFactory.INTRO,執行該動作將顯示Welcome歡迎畫面。(5)Perspective.javaPerspective類主要負責介面布局的安排。Perspective.java代碼如下。cn.edu.jfcs.app/ Perspective.javaimport …public class Perspective implements IPerspectiveFactory {     public void createInitialLayout(IPageLayout layout) {         String editorArea = layout.getEditorArea();     //獲得布局的編輯區         layout.setEditorAreaVisible(false);            //隱藏編輯區         layout.setFixed(true);                         //固定式配置         // 此處加入各種視圖     }}createInitialLayout()方法通常用於建立初始的介面布局,當前是空實現,所以開啟經費測算系統並關閉歡迎畫面後,介面會出現空白,後面將加入主介面視圖。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.