HandledContributionItem.canExecuteItem 中的 NAME
NPE in HandledContributionItem.canExecuteItem
我有这个带有工具栏的小编辑器 plugin.xml:
public class MyEditor extends EditorPart {
public static final String ID = "org.acme.project.MyEditor";
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
}
@Override
public void createPartControl(Composite parent) {
final ToolBarManager localToolBarmanager = new ToolBarManager();
final IMenuService menuService = PlatformUI.getWorkbench().getService(IMenuService.class);
menuService.populateContributionManager(localToolBarmanager, "toolbar:org.acme.menu");
localToolBarmanager.createControl(parent);
}
}
当然还有我的plugin.xml有贡献:
<extension point="org.eclipse.ui.menus">
<menuContribution allPopups="false" locationURI="toolbar:org.acme.menu">
<command commandId="org.eclipse.ui.file.saveAll" style="push" />
</menuContribution>
</extension>
编辑器打开,工具栏得到贡献,一切正常。当我关闭打开编辑器时处于活动状态的 workbench 部分时,出现以下异常:
!ENTRY org.eclipse.e4.ui.workbench.renderers.swt 4 2 2017-10-30 15:12:53.110
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.renderers.swt".
!STACK 0
java.lang.NullPointerException
at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.canExecuteItem(HandledContributionItem.java:443)
at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.run(AbstractContributionItem.java:524)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.updateItemEnablement(AbstractContributionItem.java:564)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolItemUpdater.updateContributionItems(ToolItemUpdater.java:36)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.subscribeTopicUpdateToolbarEnablement(ToolBarManagerRenderer.java:295)
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.run(UIEventObjectSupplier.java:56)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827)
而且它真的只是重点关注的一部分。我可以关闭其他部分就好了。此异常导致工具栏中的处理程序被破坏并且工具栏不再工作。
我发现了一些异常的错误:Bug 388516 & Bug 394500
但是这些应该在 4.2 中修复了(我们正在使用 4.6)。除此之外,我找不到任何可能导致类似奇怪错误消息的内容。
有人知道如何修复我们的工具栏吗?
这是更愚蠢的 E4 错误之一。对我们来说可能是前三名。
WorkbenchMenuService.populateContributionManager(ContributionManager, String)
使用当前活动的 workbench 部分来注册菜单。由于工具栏通常是在 IWorkbenchPart.createPartControl(Composite)
中创建的,这意味着新部分尚未完全创建,因此 还不是 活动部分。
因此工具栏不再适用于所有视图和编辑器!!!
我找到了解决这个巨大的 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$
我有这个带有工具栏的小编辑器 plugin.xml:
public class MyEditor extends EditorPart {
public static final String ID = "org.acme.project.MyEditor";
@Override
public void init(IEditorSite site, IEditorInput input) throws PartInitException {
setSite(site);
setInput(input);
}
@Override
public void createPartControl(Composite parent) {
final ToolBarManager localToolBarmanager = new ToolBarManager();
final IMenuService menuService = PlatformUI.getWorkbench().getService(IMenuService.class);
menuService.populateContributionManager(localToolBarmanager, "toolbar:org.acme.menu");
localToolBarmanager.createControl(parent);
}
}
当然还有我的plugin.xml有贡献:
<extension point="org.eclipse.ui.menus">
<menuContribution allPopups="false" locationURI="toolbar:org.acme.menu">
<command commandId="org.eclipse.ui.file.saveAll" style="push" />
</menuContribution>
</extension>
编辑器打开,工具栏得到贡献,一切正常。当我关闭打开编辑器时处于活动状态的 workbench 部分时,出现以下异常:
!ENTRY org.eclipse.e4.ui.workbench.renderers.swt 4 2 2017-10-30 15:12:53.110
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.e4.ui.workbench.renderers.swt".
!STACK 0
java.lang.NullPointerException
at org.eclipse.e4.ui.workbench.renderers.swt.HandledContributionItem.canExecuteItem(HandledContributionItem.java:443)
at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.run(AbstractContributionItem.java:524)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.e4.ui.workbench.renderers.swt.AbstractContributionItem.updateItemEnablement(AbstractContributionItem.java:564)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolItemUpdater.updateContributionItems(ToolItemUpdater.java:36)
at org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer.subscribeTopicUpdateToolbarEnablement(ToolBarManagerRenderer.java:295)
at sun.reflect.GeneratedMethodAccessor32.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.run(UIEventObjectSupplier.java:56)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827)
而且它真的只是重点关注的一部分。我可以关闭其他部分就好了。此异常导致工具栏中的处理程序被破坏并且工具栏不再工作。
我发现了一些异常的错误:Bug 388516 & Bug 394500
但是这些应该在 4.2 中修复了(我们正在使用 4.6)。除此之外,我找不到任何可能导致类似奇怪错误消息的内容。
有人知道如何修复我们的工具栏吗?
这是更愚蠢的 E4 错误之一。对我们来说可能是前三名。
WorkbenchMenuService.populateContributionManager(ContributionManager, String)
使用当前活动的 workbench 部分来注册菜单。由于工具栏通常是在 IWorkbenchPart.createPartControl(Composite)
中创建的,这意味着新部分尚未完全创建,因此 还不是 活动部分。
因此工具栏不再适用于所有视图和编辑器!!!
我找到了解决这个巨大的 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$