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

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

只是這么設(shè)置還是不能刪除相應(yīng)的圖形元素,需要在相應(yīng)的編輯器中重載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();
}在這里仔細(xì)研究會(huì)發(fā)現(xiàn),在第一段代碼中實(shí)際上時(shí)創(chuàng)建了一個(gè)action,這是一個(gè)RetargetAction,而在super.init()方法會(huì)調(diào)用一個(gè)createAction方法,這里創(chuàng)建的是gef默認(rèn)的redoAction?undoAction selectionAction deleteAction saveAction.需要注意的是RetargetAction是一種可以跟蹤當(dāng)前活動(dòng)的部分,由于retargetAction含有一個(gè)id,如果這個(gè)活動(dòng)部分提供的handler的id和retargetAction的id相同,那么相應(yīng)的對(duì)retargetAction的調(diào)用就轉(zhuǎn)嫁成對(duì)當(dāng)前這個(gè)活動(dòng)部分的handle的調(diào)用,(當(dāng)然如果根本就沒(méi)有handle,那么這個(gè)action會(huì)disable).所以,我們可以看出來(lái),這個(gè)retargetAction會(huì)在gef編輯器激活后調(diào)用gef的deleteAction.