web-dev-qa-db-fra.com

Erreur d'accès au thread non valide avec Java SWT

J'ai une simple Java application SWT dans Java jusqu'à présent, mais la chose étrange est quand j'essaie de lancer une boîte de message/alerte lors de l'écoute d'un événement déclenché) par l'une de mes propres classes, j'obtiens une erreur disant "Accès au thread invalide".

Mon événement de classe est déclenché et entendu par la classe principale, mais c'est lorsqu'il doit afficher le MessageBox que l'erreur "Accès au thread non valide" apparaît. J'essaie de montrer le MessageBox dans une fonction qui se compose de tous les autres codes qui créeront les interfaces graphiques SWT. Voici à quoi ressemble la fonction:

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

Ce sont les fonctions auxiliaires réunies dans la classe.

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

La trace de la pile d'erreurs est la suivante:

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)

Toute aide sera appréciée. Merci!

27
Carven

Il est levé car votre code d'écouteur est appelé depuis l'extérieur du thread d'affichage SWT. Vous exécutez du code sur le fil d'affichage comme ceci:

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

ou, de manière asynchrone:

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