到目前爲止,我在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)
任何幫助將是巨大的。 謝謝!
感謝這個例子!實際上,兩者都會這樣做嗎?當我嘗試它時,似乎兩者沒有區別。 – Carven 2011-05-22 12:19:39
@xEnOn'syncExec'阻塞,直到執行通過的代碼; 'asyncExec'在不同的線程上異步調度它。 – 2011-05-22 18:56:04
@ Jean-PhilippePellet非常感謝!後續問題:如何將參數發送到可運行程序,或者這是可能的? – 2013-11-19 17:22:40