Erro de access ao thread inválido com o Java SWT

Eu tenho um aplicativo Java SWT simples em Java até agora, mas o estranho é quando eu tento iniciar uma checkbox de mensagem / alerta ao ouvir um evento triggersdo por uma das minhas próprias classs, recebo um erro dizendo “Acesso de thread inválido”.

Meu evento de class é acionado e ouvido pela class principal, mas é quando ele tem que mostrar o MessageBox que o erro “Acesso de thread inválido” aparece. Eu estou tentando mostrar o MessageBox em uma function que consiste em todos os outros códigos que criarão as GUIs do SWT. É assim que a function se parece:

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 são as funções auxiliares juntas na class.

  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(); } } } 

O rastreamento da pilha de erros é o seguinte:

 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) 

Qualquer ajuda será ótima. Obrigado!

    Ele é lançado porque seu código de ouvinte é chamado de fora do encadeamento de exibição do SWT. Você executa o código no thread de exibição da seguinte forma:

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

    ou, de forma assíncrona:

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

    Talvez isso ajude você:

    FAQ Por que recebo uma exceção de access de encadeamento inválida? https://wiki.eclipse.org/FAQ_Why_do_I_get_an_invalid_thread_access_exception%3F