2015-02-23 94 views
0

创建视图控件类无效的线程访问

public void createPartControl(Composite parent) { 
     //viewer = new TableViewer(parent, SWT.MULTI| SWT.V_SCROLL); 
     //viewer.setContentProvider(new ViewContentProvider()); 
     //viewer.setLabelProvider(new ViewLabelProvider()); 
     // Provide the input to the ContentProvider 
     //viewer.setInput(new String[] {"One", "Two", "Three"}); 
     //Display display=new Display(); 
     parent.getShell().setText("A dialog box with no buttons at all press 'ESC' to close"); 
     final Shell shell = new Shell(Display.getCurrent()); 
     new Thread(new Runnable() 
     { 
      public void run() 
      { 
       while(true) 
       { 
        try 
        { 
         Thread.sleep(1000); 
        } 
        catch(Exception e) 
        { 

        } 
        Display.getDefault().asyncExec(new Runnable() 
        { 
         public void run() 
         { 
          shell.addPaintListener(new PaintListener() { 
           @Override 
           public void paintControl(PaintEvent event) { 
            Rectangle rect = shell.getClientArea(); 
            event.gc.drawOval(0, 0, rect.width - 1, rect.height - 1); 
           } 
          }); 
          Rectangle clientArea = shell.getClientArea(); 
          shell.setBounds(clientArea.x + 10, clientArea.y + 10, 200, 200); 
          shell.open(); 
          while (!shell.isDisposed()) 
          { 
           if (!Display.getCurrent().readAndDispatch()) 
            Display.getCurrent().sleep(); 
          } 
          Display.getCurrent().dispose(); 

         } 
        }); 
       } 
      } 

     }).start(); 
} 

谁能解释在SWT图形是如何工作的线程。它说无效的线程访问。据我说,有一个线程正在运行,我正在创建另一个线程,这肯定是错误的。那么什么是正确的方法。正在创建哪个行默认线程。
它也给小部件处理错误。为什么?

下面的代码已经从默认视图插件创建和 here
我的目的本身不是在一个单独的对话框来创建在我看来图。 我也附上了日志文件。

!ENTRY org.eclipse.osgi 4 0 2015-02-23 12:47:18.520 
!MESSAGE Application error 
!STACK 1 
org.eclipse.swt.SWTException: Invalid thread access 
    at org.eclipse.swt.SWT.error(SWT.java:4441) 
    at org.eclipse.swt.SWT.error(SWT.java:4356) 
    at org.eclipse.swt.SWT.error(SWT.java:4327) 
    at org.eclipse.swt.widgets.Display.error(Display.java:1258) 
    at org.eclipse.swt.widgets.Display.checkDevice(Display.java:764) 
    at org.eclipse.swt.widgets.Display.removeFilter(Display.java:4065) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.cleanUp(PartRenderingEngine.java:1241) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.access$5(PartRenderingEngine.java:1237) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$9.run(PartRenderingEngine.java:1166) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1032) 
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:148) 
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:636) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:579) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) 
    at swtdiagrams.Application.start(Application.java:20) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:382) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:236) 
    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) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:648) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:603) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1465) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1438) 

!ENTRY org.eclipse.ui.workbench 4 2 2015-02-23 12:47:18.535 
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.ui.workbench". 
!STACK 0 
org.eclipse.swt.SWTException: Widget is disposed 
    at org.eclipse.swt.SWT.error(SWT.java:4441) 
    at org.eclipse.swt.SWT.error(SWT.java:4356) 
    at org.eclipse.swt.SWT.error(SWT.java:4327) 
    at org.eclipse.swt.widgets.Display.error(Display.java:1258) 
    at org.eclipse.swt.widgets.Display.checkDevice(Display.java:745) 
    at org.eclipse.swt.widgets.Display.getActiveShell(Display.java:1469) 
    at org.eclipse.ui.internal.services.WorkbenchSourceProvider.getActiveWindow(WorkbenchSourceProvider.java:446) 
    at org.eclipse.ui.internal.services.WorkbenchSourceProvider.updateActivePart(WorkbenchSourceProvider.java:478) 
    at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:316) 
    at org.eclipse.ui.internal.services.WorkbenchSourceProvider.checkActivePart(WorkbenchSourceProvider.java:311) 
    at org.eclipse.ui.internal.services.WorkbenchSourceProvider$1.partDeactivated(WorkbenchSourceProvider.java:256) 
    at org.eclipse.ui.internal.PartService$4.run(PartService.java:123) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
    at org.eclipse.ui.internal.PartService.partDeactivated(PartService.java:120) 
    at org.eclipse.ui.internal.WorkbenchPage$17.run(WorkbenchPage.java:4823) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
    at org.eclipse.ui.internal.WorkbenchPage.firePartDeactivated(WorkbenchPage.java:4820) 
    at org.eclipse.ui.internal.WorkbenchPage.access$20(WorkbenchPage.java:4813) 
    at org.eclipse.ui.internal.WorkbenchPage$E4PartListener.partDeactivated(WorkbenchPage.java:214) 
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl$4.run(PartServiceImpl.java:250) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.firePartDeactivated(PartServiceImpl.java:247) 
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.activate(PartServiceImpl.java:619) 
    at org.eclipse.e4.ui.internal.workbench.PartServiceImpl.setPart(PartServiceImpl.java:205) 
    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) 
    at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55) 
    at org.eclipse.e4.core.internal.contexts.ContextObjectSupplier$ContextInjectionListener.update(ContextObjectSupplier.java:88) 
    at org.eclipse.e4.core.internal.contexts.TrackableComputationExt.update(TrackableComputationExt.java:107) 
    at org.eclipse.e4.core.internal.contexts.EclipseContext.processScheduled(EclipseContext.java:338) 
    at org.eclipse.e4.core.internal.contexts.EclipseContext.set(EclipseContext.java:352) 
    at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:196) 
    at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160) 
    at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160) 
    at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160) 
    at org.eclipse.e4.core.internal.contexts.EclipseContext.dispose(EclipseContext.java:160) 
    at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.dispose(EclipseContextOSGi.java:103) 
    at org.eclipse.e4.core.internal.contexts.osgi.EclipseContextOSGi.bundleChanged(EclipseContextOSGi.java:134) 
    at org.eclipse.osgi.internal.framework.BundleContextImpl.dispatchEvent(BundleContextImpl.java:902) 
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) 
    at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148) 
    at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEventPrivileged(EquinoxEventPublisher.java:165) 
    at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:75) 
    at org.eclipse.osgi.internal.framework.EquinoxEventPublisher.publishBundleEvent(EquinoxEventPublisher.java:67) 
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor.publishModuleEvent(EquinoxContainerAdaptor.java:102) 
    at org.eclipse.osgi.container.Module.publishEvent(Module.java:466) 
    at org.eclipse.osgi.container.Module.doStop(Module.java:624) 
    at org.eclipse.osgi.container.Module.stop(Module.java:488) 
    at org.eclipse.osgi.container.SystemModule.stop(SystemModule.java:186) 
    at org.eclipse.osgi.internal.framework.EquinoxBundle$SystemBundle$EquinoxSystemModule$1.run(EquinoxBundle.java:160) 
    at java.lang.Thread.run(Unknown Source) 

我已经研究了很多对同样的问题#1页,但没有的问题是相似的,我(他们从来没有想在视图中创建图表)。无论您看到什么代码都是所有SO建议的结果。许多甚至没有答案只是评论。
请帮忙。

编辑 在Greg编辑告诉我后,我得到了。 this

是否有反正我可以在视图上打印它(通过查看我的意思是空白,而不是旁边) 谢谢。

+1

这不会解决你的问题,但它是不明智的油漆听众再次添加到外壳并再次陷入无限循环! – isnot2bad 2015-02-23 11:28:41

+0

提出新问题,以显示您的新代码。在视图 – 2015-02-23 12:35:29

+0

问题解决中绘制应该没有问题。其实我一直在使用一个查看器,只要我删除了查看器就会占用这个空白区域。瞧,它消失了。 @ isnot2bad你的意思是说timeExecs的无限循环是错误的?如果是,应该采用哪种替代方法? – 2015-02-23 12:44:49

回答

2

您在Display对象上致电dispose() - 从不在Eclipse插件中执行此操作。

如果你想在视图区绘制自己只使用一个Canvas控制,是这样的:

public void createPartControl(Composite parent) 
{ 
    // Create control 

    final Canvas canvas = new Canvas(parent, SWT.NONE); 

    // Set up a single paint listener 

    canvas.addPaintListener(... paint the canvas); 

    // Schedule a redraw after 1000 milliseconds 

    Display.getCurrent().timerExec(1000, new Runnable() { 
    public void run() 
    { 
     if (!canvas.isDisposed()) 
     { 
      canvas.redraw(); 

      Display.getCurrent().timerExec(1000, this); 
     } 
    } 
    });  
} 
+0

为什么我不应该处置。我没有一个理论就是为什么我应该这样做。这只是它在许多示例片段中给出的。我认为这是一个很好的做法。你能解释一下吗? – 2015-02-23 10:41:43

+1

SWT应用程序中只有一个显示器,只有当应用程序停止时才会处理它(Eclipse为您服务)。 – 2015-02-23 10:42:23

+0

感谢@ greg-449的解释,还有一个问题。我已阅读在stackoverflow帖子timerExec和asyncExec是相似的哪一个我应该使用? – 2015-02-23 10:49:51

相关问题