解决RCP中CNF(navigator)配置后deletecopypast快捷键失效

    xiaoxiao2021-03-26  26

    这两天在配置一个CNF导航视图时候发现快捷键delete、past、copy等都失效了,折腾良久,搞清楚了;

    1.快捷键要想能在菜单右边显示出来:

    deleteAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_DELETE); 2.要想生效必须绑定handler:

    @Override public void fillActionBars(final IActionBars actionBars) { if (textActionHandler == null) { textActionHandler = new TextActionHandler(actionBars); // hook // handlers } textActionHandler.setCopyAction(copyAction); textActionHandler.setPasteAction(pasteAction); textActionHandler.setDeleteAction(deleteAction); // renameAction.setTextActionHandler(textActionHandler); updateActionBars(); textActionHandler.updateActionBars(); } public void updateActionBars() { actionBars.setGlobalActionHandler(ActionFactory.CUT.getId(), textCutAction); actionBars.setGlobalActionHandler(ActionFactory.COPY.getId(), textCopyAction); actionBars.setGlobalActionHandler(ActionFactory.PASTE.getId(), textPasteAction); actionBars.setGlobalActionHandler(ActionFactory.SELECT_ALL.getId(), textSelectAllAction); actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), textDeleteAction); } setGlobalActionHandler把id和action绑定到一块;

    这里你发现绑定的action并不是自己那个action,是texthandler中的action;

    如果想强制生效可以直接把这个action换成我们那个action;

    3.推荐的解决方法:

    之所以不生效,是因为系统找不到action对应的commandid,我们可以绑定:

    protected void makeActions() { clipboard = new Clipboard(shell.getDisplay()); ... deleteAction.setActionDefinitionId(IWorkbenchCommandConstants.EDIT_DELETE); initActionCommandMappingService(); } /** * 快捷键绑定actionBars.setGlobalActionHandler(); * 这里使用了textActionHandler.updateActionBars();所以绑定的是textActionHandler中text*Action,而不是这里的action; * 方法一:重新设置setGlobalActionHandler为这里的action; * 方法二:ActionCommandMappingService中添加这里的action映射WorkbenchCommandConstants.EDIT_* */ private void initActionCommandMappingService() { final IActionCommandMappingService actionCommandMappingService = (IActionCommandMappingService) CommonUIPlugin.getDefault().getWorkbench() .getActiveWorkbenchWindow().getService(IActionCommandMappingService.class); final String idDelete = actionCommandMappingService.getCommandId(ActionFactory.DELETE.getId()); if (idDelete == null) { actionCommandMappingService.map(ActionFactory.DELETE.getId(), IWorkbenchCommandConstants.EDIT_DELETE); } final String idCopy = actionCommandMappingService.getCommandId(ActionFactory.COPY.getId()); if (idCopy == null) { actionCommandMappingService.map(ActionFactory.COPY.getId(), IWorkbenchCommandConstants.EDIT_COPY); } final String idPast = actionCommandMappingService.getCommandId(ActionFactory.PASTE.getId()); if (idPast == null) { actionCommandMappingService.map(ActionFactory.PASTE.getId(), IWorkbenchCommandConstants.EDIT_PASTE); } } 这样问题就解决了

    转载请注明原文地址: https://ju.6miu.com/read-663843.html

    最新回复(0)