深入淺出Eclipse RCP(1):Hello RCP
打開Eclipse,新建一個Plug-in Project,點(diǎn)擊Next。在Project name文本框中輸入項(xiàng)目名稱net.kirin.rcp.hello,如下圖所示。
點(diǎn)擊Next,如下圖所示,在“Would you like to create a rich client application?”后面選中Yes。其余均可保留默認(rèn)值。
點(diǎn)擊Next,選擇Hello RCP模板。
點(diǎn)擊Next,打開如下對話框,各項(xiàng)均可保留默認(rèn)值。
點(diǎn)擊Finish,將創(chuàng)建結(jié)構(gòu)如下的項(xiàng)目。
雙擊MANIFEST.MF文件,將打開一個名為Overview的界面,點(diǎn)擊Launch an Eclipse application,
結(jié)果如下圖所示。
這就是我們的第一個RCP程序。當(dāng)然,我們沒有寫一行代碼,完全是Hello RCP模板自動為我們創(chuàng)建的。
代碼解析
可以看到,RCP模板自動為我們創(chuàng)建了Application.java、ApplicationActionBarAdvisor.java、ApplicationWorkbenchAdvisor.java、ApplicationWorkbenchWindowAdvisor.java、Perspective.java這5個類。下面我們對這5個類進(jìn)行逐一分析。
Application類
在普通的Java程序中,總有一個main()方法作為應(yīng)用程序的入口點(diǎn)。而RCP程序的入口點(diǎn)則是Application類。打開Application.java文件,可以看到該類實(shí)現(xiàn)了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();
}
}
run()方法為IPlatformRunnable接口所定義的方法,在RCP程序啟動時,會首先執(zhí)行該方法。Application首先創(chuàng)建一個Display對象, 然后調(diào)用PlatformUI.createAndRunWorkbench()方法創(chuàng)建并啟動工作臺,這將打開應(yīng)用程序主窗口,并使該窗口處于持續(xù)打開狀態(tài)。應(yīng)用程序開始處理用戶的鼠標(biāo)單擊、鼠標(biāo)移動、按鍵等各種事件,直到用戶關(guān)閉程序退出,這就是所謂的事件循環(huán)。當(dāng)然,在關(guān)閉之前,必須用display.dispose()銷毀Display對象以釋放資源。
ApplicationWorkbenchAdvisor類
在PlatformUI.createAndRunWorkbench()方法中,還傳入了一個新建的ApplicationWorkbenchAdvisor對象。它類負(fù)責(zé)應(yīng)用程序生命周期管理,它繼承自WorkbenchAdvisor類。開發(fā)人員可以在該類中實(shí)現(xiàn)程序啟動或者關(guān)閉時的某種處理。該類的具體實(shí)現(xiàn)只是給用戶一個初始的視圖界面而已,還需要配合WorkbenchWindowAdvisor、ActionBarAdvisor才能構(gòu)成一個較為完整的用戶界面。
打開ApplicationWorkbenchAdvisor.java文件,代碼如下:
public class ApplicationWorkbenchAdvisor extends WorkbenchAdvisor {
private static final String PERSPECTIVE_ID = "net.kirin.rcp.hello.perspective";
public WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
return new ApplicationWorkbenchWindowAdvisor(configurer);
}
public String getInitialWindowPerspectiveId() {
return PERSPECTIVE_ID;
}
}
createWorkbenchWindowAdvisor()方法初始化在主界面顯示的透視圖,并返回ApplicationWorkbenchWindowAdvisor對象。
ApplicationWorkbenchAdvisor還包含一些比較重要的方法:
- initialize:最先調(diào)用。在窗口打開之前調(diào)用,可以用來處理初始化配置工作。
- preStartup:initialize之后、第一個窗口打開之前調(diào)用,可以用來處理臨時或者可選處理工作。
- postStartup:第一個窗口打開之后但啟動事件循環(huán)之前調(diào)用,可以用來進(jìn)行那些需要自動處理的工作,例如彈出一個提示窗口。
- preShutdown:事件循環(huán)結(jié)束之后但窗口關(guān)閉之前調(diào)用,可以用來進(jìn)行保存數(shù)據(jù)、關(guān)閉數(shù)據(jù)庫服務(wù)器等處理工作。
- postShutdown:窗口關(guān)閉之后調(diào)用,可以用來進(jìn)行保存應(yīng)用程序狀態(tài)、清除initialize創(chuàng)建的對象等處理工作。
ApplicationWorkbenchWindowAdvisor類
在ApplicationWorkbenchAdvisor類中創(chuàng)建了一個ApplicationWorkbenchWindowAdvisor對象。它主要負(fù)責(zé)窗口生命周期的管理,例如狀態(tài)欄、工具欄、菜單、窗口標(biāo)題、窗口大小和各種控件等等,也可以處理窗口的各種事件例程。其主要代碼如下:
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(400, 300));
configurer.setShowCoolBar(false);
configurer.setShowStatusLine(false);
configurer.setTitle("Hello RCP");
}
}
preWindowOpen()方法在窗口控件創(chuàng)建之前調(diào)用,用來配置窗口,如設(shè)置窗口大小、工具欄、狀態(tài)欄和標(biāo)題等。createActionBarAdvisor創(chuàng)建了一個ApplicationActionBarAdvisor對象。
其它比較重要的方法還包括:
- postWindowRestore:當(dāng)窗口根據(jù)上一次的保存狀態(tài)恢復(fù)創(chuàng)建之后調(diào)用,可以用來調(diào)整調(diào)整窗口恢復(fù)狀態(tài)。
- postWindowCreate:窗口創(chuàng)建之后調(diào)用,可以用于調(diào)整窗口。
- postWindowOpen:窗口已經(jīng)打開之后調(diào)用,可以用來注冊窗口監(jiān)聽,例如在此方法中實(shí)現(xiàn)系統(tǒng)托盤。
ApplicationActionBarAdvisor類
ApplicationActionBarAdvisor主要負(fù)責(zé)管理窗口的菜單欄、狀態(tài)欄、工具欄的外觀和行為。其主要代碼如下:
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
protected void makeActions(IWorkbenchWindow window) {
}
protected void fillMenuBar(IMenuManager menuBar) {
}
}
makeActions()方法用來注冊菜單或工具欄的動作。fillMenuBar()方法用來添加菜單欄。
其它比較重要的方法還包括:
- fillCoolBar:添加工具欄
- fillStatusLine:添加狀態(tài)欄
Perspective類
Perspective類主要負(fù)責(zé)界面布局的安排,其代碼如下:
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
}
}
createInitialLayout()方法通常用于創(chuàng)建初始的界面布局。
小結(jié)
本篇作為《深入淺出Eclipse RCP》系列的開篇,介紹了如何使用Hello RCP模板創(chuàng)建最簡單的RCP程序,并對自動生成的5個類進(jìn)行了解析。如果您是RCP的初學(xué)者,也許會對本文中出現(xiàn)的一些概念改到困惑。沒有關(guān)系,我將在接下來的隨筆中介紹RPC的基本架構(gòu)以及Workbench、Action、Perspective等概念。
【編輯推薦】