2017-04-10 91 views
0

我有下面的代码片段的作品,并创建了从URI的的plugin.xml内采取项ToolBar工具栏中IContributionItem

IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 
IMenuService menuService = window.getService(IMenuService.class); 
ToolBarManager manager = new ToolBarManager(new ToolBar(body, SWT.BORDER)); 
menuService.populateContributionManager(manager, "toolbar:org.eclipse.ui.main.ribbon"); 
manager.update(true); 

我把片段一个IContributionItem内,它停止工作。有一个例外:

org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed 
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:68) 
    at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:898) 
    at org.eclipse.e4.core.internal.di.InjectorImpl.inject(InjectorImpl.java:121) 
    at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:345) 
    at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:278) 
    at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:186) 
    at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:107) 
    at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:73) 
    at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:50) 
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolControlContribution.createControl(ToolControlContribution.java:58) 
    at org.eclipse.jface.action.ControlContribution.fill(ControlContribution.java:101) 
    at org.eclipse.jface.action.ToolBarManager.update(ToolBarManager.java:343) 
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.subscribeTopicUpdateToBeRendered(ToolBarManagerRenderer.java:212) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
Caused by: org.eclipse.swt.SWTException: Widget is disposed 
    at org.eclipse.swt.SWT.error(SWT.java:4491) 
    at org.eclipse.swt.SWT.error(SWT.java:4406) 
    at org.eclipse.swt.SWT.error(SWT.java:4377) 
    at org.eclipse.swt.widgets.Widget.error(Widget.java:482) 
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:354) 
    at org.eclipse.swt.widgets.Widget.addDisposeListener(Widget.java:224) 
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.addCleanupDisposeListener(ToolBarManagerRenderer.java:420) 
    at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.processContribution(ToolBarManagerRenderer.java:406) 
    at org.eclipse.ui.internal.menus.WorkbenchMenuService.populateContributionManager(WorkbenchMenuService.java:342) 
    at org.eclipse.ui.internal.menus.SlaveMenuService.populateContributionManager(SlaveMenuService.java:90) 
    at org.eclipse.ui.internal.menus.SlaveMenuService.populateContributionManager(SlaveMenuService.java:81) 
    at org.acme.project.RibbonContribution.createControl(RibbonContribution.java:29) 

据我所知,没有控制设置(和为什么要例外得到在应用程序的开始抛出?)。

控制台还示出了下面的消息:

MESSAGE无法创建从束类 'org.eclipse.ui.internal.menus.CompatibilityWorkbenchWindowControlContribution' '87'

MESSAGE异常而!派发事件org.osgi.service.event.Event [topic = org/eclipse/e4/ui/model/ui/UIElement/visible/SET] {ChangedElement = org.eclipse.e4.ui.model.application.ui.menu .impl.ToolControlImpl @ b606cb6(elementId:[email protected],tags:null,contributorURI:null)(widget:null,renderer:org.eclipse.e4.ui.workbench.renderers。 swt.Tool ControlRenderer @ 5b9396d3,toBeRendered:true,onTop:false,visible:true,containerData:null,accessibilityPhrase:null)(contributionURI:bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.menus.CompatibilityWorkbenchWindowControlContribution ,目标:零),窗口小部件= NULL,AttName =可见的NewValue = TRUE,事件类型= SET,=的OldValue假}到处理器org[email protected]24c8d8be

这是怎么回事?我该如何解决?我怎么能把ToolBar添加到IContributionItem

回答

0

NPE in HandledContributionItem.canExecuteItem

WorkbenchMenuService.populateContributionManager(ContributionManager, String)回答了这个问题,需要当前的活动工作台上部分注册菜单。所以在这个例子中,工具栏没有要创建的活动部分。

我找到了解决这个庞大的E4错误的解决方法。致电populateContributionManager必须用以下行代替:

final MPart part = getSite().getService(MPart.class); 
    String menuLocation = "toolbar:org.acme.menu"; 

    if (menuService instanceof WorkbenchMenuService) { 
     ((WorkbenchMenuService) menuService).populateContributionManager(part, manager, menuLocation); 
    } else if (menuService instanceof SlaveMenuService) { 
     ((SlaveMenuService) menuService).populateContributionManager(part, manager, menuLocation); 
    } else 
     throw new UnsupportedOperationException("Do not know how to handle " + menuService); //$NON-NLS-1$