我想在新线程中打开Eclipse WizardMessageDialog,但是总会出现这样的异常:

Exception in thread "Thread-7" org.eclipse.swt.SWTException: Invalid thread access
    at org.eclipse.swt.SWT.error(SWT.java:4491)
    at org.eclipse.swt.SWT.error(SWT.java:4406)
    at org.eclipse.swt.SWT.error(SWT.java:4377)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:482)
    at org.eclipse.swt.widgets.Shell.<init>(Shell.java:266)
    at org.eclipse.swt.widgets.Shell.<init>(Shell.java:362)
    at org.eclipse.jface.window.Window.createShell(Window.java:486)
    at org.eclipse.jface.window.Window.create(Window.java:429)
    at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1096)
    at org.eclipse.jface.window.Window.open(Window.java:792)
    at org.eclipse.jface.dialogs.MessageDialog.open(MessageDialog.java:330)
    at de.uka.ipd.sdq.beagle.gui.GuiController$DialogPolling.run(GuiController.java:126)
    at java.lang.Thread.run(Thread.java:745)


使用如下代码时:

/**
 * Opens up the dialog displaying the actions "pause", "continue", and "abort" to the
 * user. These actions are regarding the analysis.
 */
private void engageDialog() {
    final String dialogTitle = "Beagle Analysis is Running";
    final String dialogMessage = "Beagle Analysis is running.";
    final String[] buttonLabels = {"Abort", "Pause"};
    this.messageDialog =
        new MessageDialog(this.shell, dialogTitle, null, dialogMessage, MessageDialog.INFORMATION, buttonLabels, 0);
    new Thread(new DialogPolling()).start();
}

private class DialogPolling implements Runnable {

    @Override
    public void run() {
        final int buttonClick = GuiController.this.messageDialog.open(); // line 126

        if (buttonClick == 0) {
            System.out.println("User clicked 'Abort'.");
        }

        if (buttonClick == 1) {
            System.out.println("User clicked 'Pause'.");
        }
    }
}


这来自GuiController,并标记了第126行。如果看不到行号,请向右滚动。

如何在新线程中打开向导或MessageDialog?

最佳答案

必须在单个SWT UI线程中打开所有向导,对话框...。您可以在另一个线程中使用Display.syncExec调用来运行在UI线程中打开的对话框。

Display.getDefault().syncExec(runnable);


您的Runnable可以调用对话框open并将buttonClick值保存在syncExec返回时可以访问的位置。

10-07 19:42
查看更多