Ошибка доступа к неверному потоку с Java SWT - PullRequest
27 голосов
/ 12 мая 2011

У меня пока есть простое Java SWT-приложение на Java, но странно то, что когда я пытаюсь запустить окно сообщения / окно предупреждения при прослушивании события, инициированного одним из моих собственных классов, я получаю сообщение об ошибке «Неверный потокдоступ".

Событие моего класса запускается и прослушивается основным классом, но именно когда он должен показать MessageBox, появляется ошибка «Недопустимый доступ к потоку».Я пытаюсь показать MessageBox в функции, которая состоит из всех других кодов, которые будут создавать SWT GUI.Вот как выглядит функция:

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

Это вспомогательные функции вместе в классе.

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

Трассировка стека ошибок выглядит следующим образом:

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)

Любая помощь будет отличной.Спасибо!

Ответы [ 2 ]

74 голосов
/ 12 мая 2011

Он генерируется, потому что ваш код слушателя вызывается извне потока отображения SWT.Вы запускаете код в потоке отображения следующим образом:

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

или, асинхронно:

Display.getDefault().asyncExec(new Runnable() {
    public void run() {
        // ...
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...