RCP 應用的命令入口在於菜單與工具列。本文詳細講解兩種建立方式:程式碼式(ActionBarAdvisor)與聲明式(actionSets 擴展點),並示範對話框作為最基礎互動單元的實作。
Application.run() → PlatformUI.createAndRunWorkbench()ApplicationWorkbenchAdvisor 指定預設透視圖 IDApplicationWorkbenchWindowAdvisor 設定視窗大小、標題、CoolBar 可見性ApplicationActionBarAdvisor 負責填充菜單列與工具列public class Action1 extends Action implements IWorkbenchAction {
private IWorkbenchWindow window;
public Action1(IWorkbenchWindow window) {
if (window == null) throw new IllegalArgumentException();
this.window = window;
}
@Override public void run() {
if (window != null) {
new FirstDialog(window.getShell()).open(); // 彈出對話框
}
}
@Override public void dispose() { window = null; }
}
public class ApplicationActionBarAdvisor extends ActionBarAdvisor {
private IWorkbenchAction action1;
@Override protected void makeActions(IWorkbenchWindow window) {
action1 = new Action1(window);
action1.setText("第一個菜單項");
action1.setId("cn.blogjava.youxia.actions.action1");
register(action1); // 註冊以便 Workbench 管理生命週期
}
@Override protected void fillMenuBar(IMenuManager menuBar) {
MenuManager menu = new MenuManager("第一個菜單", "cn.blogjava.youxia.firstmenu");
menuBar.add(menu);
menu.add(action1); // 加入菜單
}
}
優點:無需編譯即可修改 UI、支援圖示/工具提示/快捷鍵、可透過 Activity 動態啟停。
<extension point="org.eclipse.ui.actionSets">
<actionSet id="RCP_Start.actionSet1" label="我的菜單擴展" visible="true">
<action class="cn.blogjava.youxia.actions.Action2"
id="RCP_Start.action2"
label="第二個菜單項"
icon="icons/alt_window_16.gif"
menubarPath="cn.blogjava.youxia.firstmenu/additions"
toolbarPath="additions"
tooltip="第二個菜單項的按鈕"
style="push"/>
</actionSet>
</extension>
public class Action2 implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow window;
@Override public void init(IWorkbenchWindow window) { this.window = window; }
@Override public void run(IAction action) {
new FirstDialog(window.getShell()).open();
}
@Override public void selectionChanged(IAction action, ISelection selection) {
// 依選取資源啟用/停用按鈕
}
@Override public void dispose() { window = null; }
}
public class FirstDialog extends Dialog {
public FirstDialog(Shell parent) { super(parent, SWT.NONE); }
@Override protected void createContents() {
shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
shell.setText("第一個對話框"); shell.setSize(150, 70);
Button ok = new Button(shell, SWT.NONE);
ok.setText("OK"); ok.setBounds(10,10,48,22);
ok.addSelectionListener(e -> { result=1; shell.dispose(); });
Button cancel = new Button(shell, SWT.NONE);
cancel.setText("Cancel"); cancel.setBounds(89,10,48,22);
cancel.addSelectionListener(e -> { result=2; shell.dispose(); });
}
@Override public int open() {
createContents();
shell.open(); shell.layout();
Display display = getParent().getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
return result;
}
}
| 維度 | 程式碼式 (ActionBarAdvisor) | 聲明式 (actionSets) |
|---|---|---|
| 修改 UI | 需改代碼重編譯 | 僅改 plugin.xml |
| 動態啟停 | 手動控制 | 支援 Activities/Expressions |
| 圖示/Tooltip | 代碼設定 | XML 屬性聲明 |
| 適用場景 | 核心固定功能 | 插件貢獻、可選功能 |
菜單/工具列是 RCP 命令分發中樞。程式碼式適合核心固定功能,聲明式適合插件化擴展。對話框繼承 Dialog、實作 createContents() 即可快速構建模態互動。後續將探索視圖、編輯器與透視圖,構建完整應用框架。