Eclipse RCP:调用透视图变化导致堆栈溢出
Eclipse RCP: Calling perspectiveChanged leads to stackoverflow
我有一个 Eclipse RCP 应用程序,我正在从 Eclipse 3.0 迁移到 4.4,目前运行良好。由于迁移,添加了一些菜单条目(例如通用打开文件),我想将其删除。到目前为止这有效,因为我在我的 perspectiveActivated()
方法中调用 hideActionset(...)
。
菜单项消失。但是当我重置透视图然后更改透视图时,菜单项再次出现。我试图通过在我的 perspectiveChanged(...)
方法中调用 hideActionSet(...)
来解决这个问题,但是它们被调用得太频繁以至于我得到了一个计算器。
/**
* @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
*/
public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective)
{
if( perspective.getId().equals(m_PerspektivenID) || m_PerspektivenID.equals(STANDARDAKTION))
{
setEnabled( true );
}
else
{
setEnabled( false );
}
if(page != null)
{
page.hideActionSet("org.eclipse.ui.actionSet.keyBindings");
page.hideActionSet("org.eclipse.ui.actionSet.openFiles");
}
}
/**
* @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
*/
public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId)
{
if(page != null)
{
page.hideActionSet("org.eclipse.ui.actionSet.keyBindings");
page.hideActionSet("org.eclipse.ui.actionSet.openFiles");
}
}
这是正在生成的两个日志文件之一的片段:
!ENTRY org.eclipse.equinox.event 4 0 2016-01-12 14:37:00.768
!MESSAGE Exception while dispatching event org.osgi.service.event.Event [topic=org/eclipse/e4/ui/model/ui/UIElement/widget/SET] to handler org.eclipse.e4.ui.services.internal.events.UIEventHandler@faec277
!STACK 0
java.lang.WhosebugError
at java.util.HashMap.hash(HashMap.java:338)
at java.util.HashMap.containsKey(HashMap.java:595)
at java.util.Collections$SynchronizedMap.containsKey(Collections.java:2578)
at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:347)
at org.eclipse.e4.ui.internal.services.ContextContextService.setEventCaching(ContextContextService.java:129)
at org.eclipse.e4.ui.internal.services.ContextContextService.deferUpdates(ContextContextService.java:86)
at org.eclipse.ui.internal.contexts.ContextService.deferUpdates(ContextService.java:92)
at org.eclipse.ui.internal.Perspective.removeActionSet(Perspective.java:362)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2593)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.runtime.Platform.run(Platform.java:867)
at org.eclipse.ui.internal.PerspectiveListenerList.fireEvent(PerspectiveListenerList.java:58)
at org.eclipse.ui.internal.PerspectiveListenerList.firePerspectiveChanged(PerspectiveListenerList.java:131)
at org.eclipse.ui.internal.WorkbenchWindow.firePerspectiveChanged(WorkbenchWindow.java:1721)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2596)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.runtime.Platform.run(Platform.java:867)
at org.eclipse.ui.internal.PerspectiveListenerList.fireEvent(PerspectiveListenerList.java:58)
at org.eclipse.ui.internal.PerspectiveListenerList.firePerspectiveChanged(PerspectiveListenerList.java:131)
at org.eclipse.ui.internal.WorkbenchWindow.firePerspectiveChanged(WorkbenchWindow.java:1721)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2596)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.runtime.Platform.run(Platform.java:867)
at org.eclipse.ui.internal.PerspectiveListenerList.fireEvent(PerspectiveListenerList.java:58)
at org.eclipse.ui.internal.PerspectiveListenerList.firePerspectiveChanged(PerspectiveListenerList.java:131)
at org.eclipse.ui.internal.WorkbenchWindow.firePerspectiveChanged(WorkbenchWindow.java:1721)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2596)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
如果您查看堆栈跟踪,您可以清楚地看到,当您调用 WorkbenchPage.hideActionSet
时,将触发一个新的视角更改事件,并且当您仍在第一个时再次调用 perspectiveChanged
perspectiveChanged
呼唤。
阻止这种情况的一种方法是在您的 perspectiveChanged
方法中设置一个标志,以检测您已经在处理更改。
类似于:
private boolean changeActive;
public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId)
{
if (changeActive) { // Don't do anything if already handling change
return;
}
changeActive = true;
if (page != null)
{
page.hideActionSet("org.eclipse.ui.actionSet.keyBindings");
page.hideActionSet("org.eclipse.ui.actionSet.openFiles");
}
changeActive = false;
}
我有一个 Eclipse RCP 应用程序,我正在从 Eclipse 3.0 迁移到 4.4,目前运行良好。由于迁移,添加了一些菜单条目(例如通用打开文件),我想将其删除。到目前为止这有效,因为我在我的 perspectiveActivated()
方法中调用 hideActionset(...)
。
菜单项消失。但是当我重置透视图然后更改透视图时,菜单项再次出现。我试图通过在我的 perspectiveChanged(...)
方法中调用 hideActionSet(...)
来解决这个问题,但是它们被调用得太频繁以至于我得到了一个计算器。
/**
* @see org.eclipse.ui.IPerspectiveListener#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
*/
public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective)
{
if( perspective.getId().equals(m_PerspektivenID) || m_PerspektivenID.equals(STANDARDAKTION))
{
setEnabled( true );
}
else
{
setEnabled( false );
}
if(page != null)
{
page.hideActionSet("org.eclipse.ui.actionSet.keyBindings");
page.hideActionSet("org.eclipse.ui.actionSet.openFiles");
}
}
/**
* @see org.eclipse.ui.IPerspectiveListener#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, java.lang.String)
*/
public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId)
{
if(page != null)
{
page.hideActionSet("org.eclipse.ui.actionSet.keyBindings");
page.hideActionSet("org.eclipse.ui.actionSet.openFiles");
}
}
这是正在生成的两个日志文件之一的片段:
!ENTRY org.eclipse.equinox.event 4 0 2016-01-12 14:37:00.768
!MESSAGE Exception while dispatching event org.osgi.service.event.Event [topic=org/eclipse/e4/ui/model/ui/UIElement/widget/SET] to handler org.eclipse.e4.ui.services.internal.events.UIEventHandler@faec277
!STACK 0
java.lang.WhosebugError
at java.util.HashMap.hash(HashMap.java:338)
at java.util.HashMap.containsKey(HashMap.java:595)
at java.util.Collections$SynchronizedMap.containsKey(Collections.java:2578)
at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:347)
at org.eclipse.e4.ui.internal.services.ContextContextService.setEventCaching(ContextContextService.java:129)
at org.eclipse.e4.ui.internal.services.ContextContextService.deferUpdates(ContextContextService.java:86)
at org.eclipse.ui.internal.contexts.ContextService.deferUpdates(ContextService.java:92)
at org.eclipse.ui.internal.Perspective.removeActionSet(Perspective.java:362)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2593)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.runtime.Platform.run(Platform.java:867)
at org.eclipse.ui.internal.PerspectiveListenerList.fireEvent(PerspectiveListenerList.java:58)
at org.eclipse.ui.internal.PerspectiveListenerList.firePerspectiveChanged(PerspectiveListenerList.java:131)
at org.eclipse.ui.internal.WorkbenchWindow.firePerspectiveChanged(WorkbenchWindow.java:1721)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2596)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.runtime.Platform.run(Platform.java:867)
at org.eclipse.ui.internal.PerspectiveListenerList.fireEvent(PerspectiveListenerList.java:58)
at org.eclipse.ui.internal.PerspectiveListenerList.firePerspectiveChanged(PerspectiveListenerList.java:131)
at org.eclipse.ui.internal.WorkbenchWindow.firePerspectiveChanged(WorkbenchWindow.java:1721)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2596)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
at org.eclipse.core.runtime.Platform.run(Platform.java:867)
at org.eclipse.ui.internal.PerspectiveListenerList.fireEvent(PerspectiveListenerList.java:58)
at org.eclipse.ui.internal.PerspectiveListenerList.firePerspectiveChanged(PerspectiveListenerList.java:131)
at org.eclipse.ui.internal.WorkbenchWindow.firePerspectiveChanged(WorkbenchWindow.java:1721)
at org.eclipse.ui.internal.WorkbenchPage.hideActionSet(WorkbenchPage.java:2596)
at packagenane.classname.perspectiveChanged(BaseAction.java:146)
at org.eclipse.ui.internal.PerspectiveListenerList.run(PerspectiveListenerList.java:134)
如果您查看堆栈跟踪,您可以清楚地看到,当您调用 WorkbenchPage.hideActionSet
时,将触发一个新的视角更改事件,并且当您仍在第一个时再次调用 perspectiveChanged
perspectiveChanged
呼唤。
阻止这种情况的一种方法是在您的 perspectiveChanged
方法中设置一个标志,以检测您已经在处理更改。
类似于:
private boolean changeActive;
public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective, String changeId)
{
if (changeActive) { // Don't do anything if already handling change
return;
}
changeActive = true;
if (page != null)
{
page.hideActionSet("org.eclipse.ui.actionSet.keyBindings");
page.hideActionSet("org.eclipse.ui.actionSet.openFiles");
}
changeActive = false;
}