一、前言
本文承接上一節:
GEF入門執行個體_總結_02_建立初始RCP空項目這一節,我們來給我們的插件加上菜單。
二、基礎知識
1.action bar、menubar、coolbar
含義 | |
action bar | 操作條 |
action | 動作。單擊菜單、工具欄圖示按鈕或者按鍵時執行某項處理 |
menubar | 菜單欄 |
coolbar | 工具欄 |
2.菜單在哪裡加
還記得上一節我們建立的類: ApplicationActionBarAdvisor 嗎,這個類繼承自 ActionBarAdvisor。
我們打開 ActionBarAdvisor 源碼,看看它的類注釋:
/**
* Public base class for configuring the action bars of a workbench window.
* <p>
* An application should declare a subclass of <code>ActionBarAdvisor</code>
* and override methods to configure a window's action bars to suit the needs of the
* particular application.
翻譯過來就是:
(1) 用于配置工作台視窗的 action bars 的公共基類。
(2) 應用程式應該聲明ActionBarAdvisor的子類和重寫方法,以配置視窗的 action bar 來滿足特定應用程式的需要。
也就是說,我們需要在 ApplicationActionBarAdvisor 類中,通過重寫父類的方法,來填充菜單欄。
3.菜單怎麼加
注意到我們在第一節中為 ApplicationActionBarAdvisor 類重寫了三個方法,就是為這裡準備的。
方法名 | 作用 |
makeActions | 生成并注冊Action。Action隻有注冊後才能添加到菜單中 |
fillMenuBar | 填充菜單欄。用Action來填充菜單 |
fillCoolBar | 填充工具欄。用Action來填充工具欄 |
三、準備Action
1、圖檔
請前往GitHub下載下傳源碼,拷貝圖檔到此工程的icons檔案夾下。 傳送門:
GEF入門執行個體_總結_01_教程、源碼、開發環境準備注:
Eclipse插件開發時,圖檔都預設儲存在icons檔案夾中,請不要修改檔案夾名稱。
2、圖檔常量類 IImageConstant
在包 constant 下建立圖檔常量類 IImageConstant ,用來集中管理程式中用到的圖檔資源。

package gef.tutorial.step.constant;
public interface IImageConstant {
public static final String EDITORTITLE = "icons/example.gif";
public static final String NEWHELLOMODEL = "icons/newModel.gif";
public static final String NEWCONNECTION = "icons/newConnection.gif";
public static final String ARROWCONNECTION = "icons/arrowConnection.gif";
}
View Code
3、DiagramAction
準備一個Action,它的動作就是:點選的時候,打開一個檔案對話框。
建立一個 DiagramAction,

package gef.tutorial.step.action;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IWorkbenchWindow;
import gef.tutorial.step.app.Activator;
import gef.tutorial.step.constant.IImageConstant;
/**
* DiagramAction
*
* @author shirayner
*
*/
public class DiagramAction extends Action {
private final IWorkbenchWindow window;
public final static String ID = "gef.tutorial.step.action.DiagramAction";
/**
* 一、在構造方法中設定基本屬性
*
* @param window
*/
public DiagramAction(IWorkbenchWindow window) {
this.window = window;
//1.定義該Action的ID. 每一個Action需要一個唯一的ID号
setId(ID);
//2.設定該Action的文字。該文字也就是菜單上的文字。"@ALT+D"用來設定該Action的快捷鍵
setText("&Diagram@ALT+D");
//3.設定工具欄的提示文本
setToolTipText("Draw the GEF diagram.");
//4.設定該Action的圖檔。該方法使用 AbstractUIPlugin 抽象類的 imageDescriptorFromPlugin() 方法快捷地擷取圖像。
//imageDescriptorFromPlugin()方法需要兩個參數:項目ID、圖檔檔案名。
setImageDescriptor(Activator.imageDescriptorFromPlugin( Activator.PLUGIN_ID, IImageConstant.EDITORTITLE));
}
/**
* 二、在Run方法中設定要執行的動作。
* 單擊菜單、工具欄圖示按鈕或者按鍵時會執行Action的run方法
*
*/
@Override
public void run() {
String path = openFileDialog();
if (path != null) {
//彈出一個對話框
MessageDialog.openInformation(window.getShell(), "溫馨提示", "檔案儲存路徑為:"+path);
}
}
/** 打開一個檔案對話框
*
* @return
* String 檔案路徑
*/
private String openFileDialog(){
FileDialog dialog = new FileDialog(window.getShell(),SWT.OPEN);
dialog.setText("檔案儲存到");
dialog.setFilterExtensions(new String[] { ".diagram" });
return dialog.open();
}
}
四、填充菜單和工具欄
1. ApplicationActionBarAdvisor
接下來我們将要重寫 ApplicationActionBarAdvisor 的三個方法來填充菜單和工具欄。

package gef.tutorial.step.app;
import org.eclipse.jface.action.ICoolBarManager;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.action.ToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import gef.tutorial.step.action.DiagramAction;
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private IWorkbenchAction exitAction;
private IWorkbenchAction aboutAction;
private DiagramAction diagramAction;
public ApplicationActionBarAdvisor(IActionBarConfigurer configurer) {
super(configurer);
}
/**
* 1.生成并注冊Action。Action隻有注冊後才能添加到菜單中。
*
*/
@Override
protected void makeActions(IWorkbenchWindow window) {
//退出
exitAction = ActionFactory.QUIT.create(window);
register(exitAction);
//關于
aboutAction = ActionFactory.ABOUT.create(window);
register(aboutAction);
//繪圖
diagramAction = new DiagramAction(window);
register(diagramAction);
}
/**
* 2.填充菜單欄。用Action來填充菜單
*
* (1) 菜單管理器負責管理菜單項、設定菜單行為、建立級聯菜單或者對菜單項進行分組。
* (2) MenuManager構造函數:菜單項文本、菜單項ID
* (3) new Separator() 為一條分割線
*/
@Override
protected void fillMenuBar(IMenuManager menuBar) {
//(1)一級菜單 File
MenuManager fileMenuManager= new MenuManager("File", "fileMenuManager");
//加入繪圖動作,是葉子節點菜單,也是二級菜單。點選之後将執行Action的run方法
fileMenuManager.add(diagramAction);
//加入分隔符
fileMenuManager.add(new Separator());
//加入退出動作
fileMenuManager.add(exitAction);
//(2)一級菜單 Help
MenuManager helpMenuManager = new MenuManager("Help", "helpMenuManager");
helpMenuManager.add(aboutAction);
//加入二級菜單
helpMenuManager.add(fileMenuManager);
//(3)将菜單加入菜單欄
menuBar.add(fileMenuManager);
menuBar.add(helpMenuManager);
}
/**
* 3.填充工具欄。用Action來填充工具欄
* (1) 工具欄預設是不顯示。在 ApplicationWorkbenchWindowAdvisor 類中的
* preWindowOpen方法中有一句 configurer.setShowCoolBar(false);将false改為true即可顯示工具欄
* (2) 工具欄管理器負責工具欄的分類管理
* (3) SWT.FLAT将工具欄設定成平滑方式,SWT.SHADOW_OUT用于在工具欄和菜單欄之間加一條分割線
*
*/
@Override
protected void fillCoolBar(ICoolBarManager coolBar) {
//1.生成工具欄
ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT | SWT.SHADOW_OUT);
//2.将工具放入工具欄
toolBarManager.add(diagramAction);
//3.将工具欄放入
coolBar.add(toolBarManager);
}
}
2.設定顯示工具欄
在 ApplicationWorkbenchWindowAdvisor 類中的 preWindowOpen方法中有一句 configurer.setShowCoolBar(false);
将false改為true即可顯示工具欄
ApplicationWorkbenchWindowAdvisor

package gef.tutorial.step.app;
import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.application.ActionBarAdvisor;
import org.eclipse.ui.application.IActionBarConfigurer;
import org.eclipse.ui.application.IWorkbenchWindowConfigurer;
import org.eclipse.ui.application.WorkbenchWindowAdvisor;
public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {
public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) {
super(configurer);
}
@Override
public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) {
return new ApplicationActionBarAdvisor(configurer);
}
@Override
public void preWindowOpen() {
IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
//1.設定視窗初始化大小
configurer.setInitialSize(new Point(700, 550));
//2.顯示工具欄
configurer.setShowCoolBar(true);
//3.不顯示狀态欄
configurer.setShowStatusLine(false);
//4.設定視窗标題
configurer.setTitle("GEF入門執行個體"); //$NON-NLS-1$
}
}
五、效果圖
(1)現在運作程式,看到菜單欄File、Help ,已經加上去了,工具欄也加上去了。
但是 Run、Search 是什麼鬼。這裡我查了好久,都沒發現是什麼問題,希望讀者能為我解惑!
(2)點選 子菜單diagram 出現下圖文本對話框。
(3)點選打開之後
六、異常
1.多出來的Run、Search菜單項
(1)異常現象
運作程式後,發現多出了Run、Search菜單項
(2)異常解決
參考資料:
Remove Eclipse’s top menus添加如下擴充點可隐藏Run菜單

<extension
point="org.eclipse.ui.perspectiveExtensions">
<perspectiveExtension
targetID="gef.tutorial.step.perspective">
<hiddenMenuItem
id="org.eclipse.ui.run">
</hiddenMenuItem>
</perspectiveExtension>
</extension>