RCP開發中錯誤:java.lang.RuntimeException: WARNING: Prevented recursive attempt to activate part...

在做RCP的eclipse插件開發時,啓動管理軟件界面時,總是報如下錯誤 :

!ENTRY org.eclipse.ui.workbench 4 0 2012-05-25 18:44:21.306
!MESSAGE WARNING: Prevented recursive attempt to activate part org.gluster.storage.management.console.views.ClusterSummaryView while still in the middle of activating part org.gluster.storage.management.console.views.NavigationView
!STACK 0
java.lang.RuntimeException: WARNING: Prevented recursive attempt to activate part org.gluster.storage.management.console.views.ClusterSummaryView while still in the middle of activating part org.gluster.storage.management.console.views.NavigationView
 at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3586)
 at org.eclipse.ui.internal.WorkbenchPage.internalActivate(WorkbenchPage.java:691)
 at org.eclipse.ui.internal.WorkbenchPage.activate(WorkbenchPage.java:663)
 at org.eclipse.ui.internal.WorkbenchPage.busyShowView(WorkbenchPage.java:1170)
 at org.eclipse.ui.internal.WorkbenchPage.busyShowView(WorkbenchPage.java:1147)
 at org.eclipse.ui.internal.WorkbenchPage$20.run(WorkbenchPage.java:3921)
 at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
 at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:3918)
 at org.eclipse.ui.internal.WorkbenchPage.showView(WorkbenchPage.java:3894)
 at org.gluster.storage.management.console.views.GlusterViewsManager.showViewsForCluster(GlusterViewsManager.java:82)
 at org.gluster.storage.management.console.views.GlusterViewsManager.updateViews(GlusterViewsManager.java:53)
 at org.gluster.storage.management.console.views.NavigationView.selectionChanged(NavigationView.java:142)
 at org.eclipse.ui.internal.AbstractSelectionService.fireSelection(AbstractSelectionService.java:156)
 at org.eclipse.ui.internal.AbstractSelectionService.setActivePart(AbstractSelectionService.java:282)
 at org.eclipse.ui.internal.WorkbenchPagePartList.fireActivePartChanged(WorkbenchPagePartList.java:60)
 at org.eclipse.ui.internal.PartList.setActivePart(PartList.java:136)
 at org.eclipse.ui.internal.WorkbenchPage.setActivePart(WorkbenchPage.java:3636)
 at org.eclipse.ui.internal.WorkbenchPage.internalActivate(WorkbenchPage.java:691)
 at org.eclipse.ui.internal.WorkbenchPage.activate(WorkbenchPage.java:663)
 at org.eclipse.ui.internal.WorkbenchPage.makeActive(WorkbenchPage.java:1324)
 at org.eclipse.ui.internal.WorkbenchPage.updateActivePart(WorkbenchPage.java:1304)
 at org.eclipse.ui.internal.WorkbenchPage.updateVisibility(WorkbenchPage.java:3779)
 at org.eclipse.ui.internal.WorkbenchPage.onActivate(WorkbenchPage.java:2715)
 at org.eclipse.ui.internal.WorkbenchWindow$27.run(WorkbenchWindow.java:3023)
 at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
 at org.eclipse.ui.internal.WorkbenchWindow.setActivePage(WorkbenchWindow.java:3004)
 at org.eclipse.ui.internal.WorkbenchWindow.busyOpenPage(WorkbenchWindow.java:799)
 at org.eclipse.ui.internal.Workbench$23.runWithException(Workbench.java:1224)
 at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
 at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:803)
 at org.eclipse.ui.internal.Workbench$33.runWithException(Workbench.java:1595)
 at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:31)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3563)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3212)
 at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
 at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
 at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
 at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
 at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
 at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
 at org.gluster.storage.management.console.Application.start(Application.java:100)
 at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
 at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
 at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
 at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

之前一直不知道錯誤原因,在網上查了一下,解決辦法有幾個 ,

1.New focus event is run while other focus event was executing and therefore not finished yet.
You have to override setFocus() or find a good place and put this inside your code:

Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                while (Display.getDefault().readAndDispatch()) {
                    //wait for events to finish before continue
                }
                // your code for focus here
                // e.g. table.forceFocus()
            }
});


So Display will wait until current focus event is finish, and then will execute new focus event.


根據我的測試,上面的代碼中,去掉 
while (Display.getDefault().readAndDispatch()) {
    //wait for events to finish before continue
}

這段也是一樣可以的


2.  I just found that one of my colleagues add a PartListener to the part service. When an activated part was adaptable to the IContentOutlinePage, the listener activates the ContentOutline view, so it get also the focus. This was the reason of the exception.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章