最近做的gef編輯器在刪除時遇到了一些問題,就是不能通過delete鍵刪除,到處搜集資料,解決了,
首先需要在相應rcp工程中的ActionBarAdviser類中注冊相應的Action,比如對應于deleteAction,我在方法org.eclipse.ui.application.ActionBarAdvisor#makeAction(IWorkbenchWindow)中注冊deleteAction,如下:

protected?void?makeAction(final?IWorkbenchWindow?window)
{
????IAction?delAction?=?ActionFactory.DELETE.create(window);
????register(delAction);
}

只是這么設置還是不能刪除相應的圖形元素,需要在相應的編輯器中重載init方法,添加如下的代碼

public?void?init(IEditorSite?site,?IEditorInput?input)?throws?PartInitException?
{
????//?TODO?Auto-generated?method?stub
????super.init(site,?input);
????ActionRegistry?registry?=?getActionRegistry();
????IActionBars?bar?=?site.getActionBars();
????String?id?=?ActionFactory.DELETE.getId();
????bar.setGlobalActionHandler(id,registry.getAction(id));
????bar.updateActionBars();
}在這里仔細研究會發現,在第一段代碼中實際上時創建了一個action,這是一個RetargetAction,而在super.init()方法會調用一個createAction方法,這里創建的是gef默認的redoAction?undoAction selectionAction deleteAction saveAction.需要注意的是RetargetAction是一種可以跟蹤當前活動的部分,由于retargetAction含有一個id,如果這個活動部分提供的handler的id和retargetAction的id相同,那么相應的對retargetAction的調用就轉嫁成對當前這個活動部分的handle的調用,(當然如果根本就沒有handle,那么這個action會disable).所以,我們可以看出來,這個retargetAction會在gef編輯器激活后調用gef的deleteAction.