Java IContributionItem中的工具栏

Java IContributionItem中的工具栏,java,eclipse-plugin,e4,Java,Eclipse Plugin,E4,我有以下代码片段,可以使用plugin.xml中的URI创建一个工具栏: 我将代码片段放在IContributionItem中,它停止了工作。有一个例外: org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: Widget is disposed at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.j

我有以下代码片段,可以使用plugin.xml中的URI创建一个
工具栏

我将代码片段放在
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)
据我所知,没有释放任何控件(为什么要释放?在应用程序启动时抛出异常)

控制台还显示以下消息:

!!消息无法从捆绑包“87”创建类“org.eclipse.ui.internal.menus.compatibilityWorkbenchWindowControlControlContribution”

!!发送事件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:org.eclipse.core.internal.registry。ConfigurationElementHandle@3f,标记:null,contributorURI:null)(小部件:null,呈现器:org.eclipse.e4.ui.workbench.renderers.swt。ToolControlRenderer@5b9396d3,toberndered:true,onTop:false,visible:true,containerData:null,accessibilityPhrase:null)(contributionURI:bundleclass://org.eclipse.ui.workbench/org.eclipse.ui.internal.menus.CompatibilityWorkbenchWindowControlContribution,对象:空),Widget=null,AttName=visible,NewValue=true,EventType=SET,OldValue=false}到handler org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler@24c8d8be


发生了什么事?如何解决此问题?如何将
工具栏添加到
IContributionItem

我在中回答了此问题

WorkbenchmentUservice.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$
    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$