2011-05-12 54 views
24

到目前爲止,我在Java中有一個簡單的Java SWT應用程序,但奇怪的是,當我嘗試在收聽由我自己的類之一觸發的事件時啓動messagebox/alert框時,我出現「無效的線程訪問」錯誤。Java SWT中的線程訪問錯誤無效

我的類事件被主類觸發並聽到,但是它必須顯示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) 

任何幫助將是巨大的。 謝謝!

回答

66

它拋出,因爲你的聽衆代碼從SWT顯示線程之外調用。您在顯示器上線這樣的運行代碼:

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

,或者異步:

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

感謝這個例子!實際上,兩者都會這樣做嗎?當我嘗試它時,似乎兩者沒有區別。 – Carven 2011-05-22 12:19:39

+1

@xEnOn'syncExec'阻塞,直到執行通過的代碼; 'asyncExec'在不同的線程上異步調度它。 – 2011-05-22 18:56:04

+0

@ Jean-PhilippePellet非常感謝!後續問題:如何將參數發送到可運行程序,或者這是可能的? – 2013-11-19 17:22:40

相關問題