2011-05-12 30 views
24

Tengo una aplicación Java SWT simple en Java hasta el momento, pero lo extraño es cuando intento abrir un cuadro de mensaje/alerta al escuchar un evento disparado por una de mis propias clases, recibe un mensaje de error que dice "Acceso inválido al hilo".Error de acceso al subproceso no válido con Java SWT

Mi clase se desata y se escucha por la clase principal, pero es cuando tiene que mostrar el MessageBox que aparece el error "Acceso no válido al hilo". Estoy tratando de mostrar el MessageBox en una función que consta de todos los otros códigos que crearán las GUI de SWT. Así es como se ve la función:

public void createContents() { 
    Shell shell = new Shell(); 
    //.....all the SWT GUI codes.... 
    MessageBox msg = new MessageBox(shell, SWT.OK); 
    myClass.addEventListener(new MyClassEventClassListener() { 
     @Override 
     public void myClassEventHandler(MyClassEvent e) { 
      msg.setText("Hello"); 
      msg.setMessage("Event fired!"); 
      int result = msg.open(); 
     } 
    }); 
} 

Estas son las funciones auxiliares juntas en la clase.

<!-- language: lang-java --> 
protected static Shell shell; 
public static void main(String[] args) { 
    MyClass new myClass = new MyClass(); 

    try { 
     SWTApp window = new SWTApp(); 
     window.open(); 
    } catch (Exception e) {  
} 

public void open() { 
    Display display = Display.getDefault(); 
    createContents(); 
    shell.open(); 
    shell.layout(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
} 

El seguimiento de la pila de error es el siguiente:

Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access 
    at org.eclipse.swt.SWT.error(SWT.java:4083) 
    at org.eclipse.swt.SWT.error(SWT.java:3998) 
    at org.eclipse.swt.SWT.error(SWT.java:3969) 
    at org.eclipse.swt.widgets.Display.error(Display.java:1249) 
    at org.eclipse.swt.widgets.Display.checkDevice(Display.java:755) 
    at org.eclipse.swt.widgets.Display.getShells(Display.java:2171) 
    at org.eclipse.swt.widgets.Display.setModalDialog(Display.java:4463) 
    at org.eclipse.swt.widgets.MessageBox.open(MessageBox.java:200) 

Cualquier ayuda será grande. Gracias!

Respuesta

66

Se produce porque el código de escucha se llama desde fuera del hilo SWT Display. Ejecutar código en el hilo pantalla como esta:

Display.getDefault().syncExec(new Runnable() { 
    public void run() { 
     // ... 
    } 
}); 

o, de forma asíncrona:

Display.getDefault().asyncExec(new Runnable() { 
    public void run() { 
     // ... 
    } 
}); 
+0

¡Gracias por el ejemplo! en realidad, ¿ambos harían lo mismo? Parece que ambos no tienen ninguna diferencia cuando lo intenté. – Carven

+1

@xEnOn bloques 'syncExec' hasta que se ejecute el código pasado; 'asyncExec' lo programa asincrónicamente en un hilo diferente. –

+0

@ Jean-PhilippePellet ¡Gracias por esto! Una pregunta de seguimiento: ¿cómo puedo enviar parámetros al ejecutable, o es posible? –

Cuestiones relacionadas