1

我正在注册一个生命周期监听器plugin.xml。如果我只定义一个Shell.
例如

@PostContextCreate  
void postContextCreate(final IEventBroker eventBroker){  
     System.out.println("CALLED!");    
     final Shell shell = new Shell(SWT.TOOL | SWT.NO_TRIM);  
     shell.open();  
     eventBroker.subscribe(UIEvents.UILifeCycle.ACTIVATE, new EventHandler() {  

    @Override  
    public void handleEvent(Event event) {  
        System.out.println("Closing shell");  
        shell.close();  
        shell.dispose();  
        System.out.println("Closed");  
        eventBroker.unsubscribe(this);  
        }
     });

但是,如果我将调用更改为也使用 a Display

@PostContextCreate
void postContextCreate(final IEventBroker eventBroker){  
    System.out.println("CALLED!");  
    Display display = new Display();  
    final Shell shell = createSplashShell(display);  
    shell.open();  
    while (!shell.isDisposed ()) {  
    if (!display .readAndDispatch ()) display.sleep ();  
    }
    display.dispose ();  
   //etc  

我得到以下异常:

org.eclipse.e4.core.di.InjectionException: org.eclipse.swt.SWTException: org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:63) 在
org.eclipse的线程访问无效.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:229) 在 org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:206) 在

我知道这个异常必须对UI线程做一些事情,但我无法弄清楚 using 是如何Display导致这个异常的。
有什么帮助吗?

4

2 回答 2

5

使用Display.asyncExec方法在 UI 线程上执行 Runnable。

与大多数 UI 框架一样,SWT 不允许任何线程作用于 UI 组件,因此当您要从另一个线程更改某些内容时,您必须将其提供给在 UI 线程上执行它的实用程序。

于 2012-09-19T17:22:41.277 回答
4

据我了解,我看到您想在事件发生时弹出一个外壳。一个显示(由主 RCP 应用程序创建)足以创建新的 shell 和处理事件。

@PostContextCreate
    void postContextCreate(final IEventBroker eventBroker){  
        System.out.println("CALLED!");

        final Display display = Display.getDefault();
        Display.getDefault().asyncExec(new Runnable()
        {
          public void run()
        { 
         final Shell shell = createSplashShell(display);  
         shell.open();  
         while (!shell.isDisposed ()) {  
         if (!display .readAndDispatch ()) display.sleep ();  
        }
      }
    }
于 2012-09-19T18:36:09.537 回答