首先講一下eclipse中給Action中添加快捷鍵的一般方法
?????? 要添加快捷鍵,必須要擴展eclipse的org.eclipse.ui.command和org.eclipse.ui.binding這兩個extension.然后Action和command關聯,command又和一個binding關聯起來,這樣就間接的使action和binding有了關聯.有人會問,這樣做是不是太麻煩了,我直接把action和binding關聯起來不就行了?最好是有個方法,比如action.setKeybind("Ctrl+A").其實eclipse這樣做是涉及到設計模式的問題.如果用這種"簡單"方法,你以后如果想要改actioon的快捷鍵就要去改action的源碼了,是一種緊耦合的關系.而eclipse的處理方式削弱了這種耦合,你如果要改快捷鍵,改binding就可以了,你還可以讓一個action在不同的perspective,甚至是不同的view中使用不同的快捷鍵.讓一個action對應多個快捷鍵等等.
?????? ?command和binding的關聯在你擴展這兩個extension的時候就可以建立了,下面看看怎么讓一個action對應一個command
??????? 在你的插件中添加Action有兩種方法:1.通過plugin.xml擴展extension.2.直接在代碼中code. 如果是用第一種方法,在Action的設置中會有definitionId這一項,你把它填上你自己寫的command的Id就好了;如果是第二種方法,那需要在你的定義action的代碼中加上兩句:
????????????????? yourAction.setActionDefinitionId("commandId");
????????????????? getViewSite().getKeyBindingService().registerAction(yourAction);
這兩種方法是等效的
?? 但要給viewaction添加快捷鍵以上兩種方法都有點問題.viewaction在plugin.xml文件中是沒有definitionId這一項的,所以你沒辦法設置;如果你是program方法,由于viewaction不是繼承自Action類的,所以你也不能用setActionDefinitionId這個方法.聰明的你可能會想到了,那我讓viewaction繼承Action不就行了:
???? public class ViewAction
extends Action? implements IViewActionDelegate //紅色部分是自己添加的extends
?{???? ...
????? public void init(IViewPart view) {
???????????????? this.view=view;
?????????????? this.setActionDefinitionId("ViewAction.command1");
??????????? view.getViewSite().getKeyBindingService().registerAction(this);
?????????}??????
}
這個方法理論上可以,但可惜也僅僅是理論上行得通而已.具體是為什么我也不知道,如果有大牛告知小弟不勝感激.我后來的解決辦法是這樣的:在viewaction的init方法中加入以下代碼段
???? this.view=view;
??IContributionItem item= view.getViewSite().getActionBars().getToolBarManager().find("ViewAction.action1");
??IAction action=((ActionContributionItem)item).getAction();
??action.setActionDefinitionId("ViewAction.command1");
??view.getSite().getKeyBindingService().registerAction(action);
這樣就可以給viewaction添加快捷鍵了