我有一个最简单的SWT程序(它甚至还没有显示hello world):
package com.samples.swt.first;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
}
当我从Eclipse Helios在Mac OSX上运行这个时,我得到以下错误:
***警告:由于Cocoa限制,必须在主线程上创建显示。
线程"main"中的异常org.eclipse.swt.SWT.error(SWT.java:4282)的线程访问无效org.eclipse.swt.SWT.error (SWT.java: 4197)org.eclipse.swt.SWT.error (SWT.java: 4168)org.eclipse.swt.widgets.Display.error (Display.java: 1065)org.eclipse.swt.widgets.Display.createDisplay (Display.java: 822)org.eclipse.swt.widgets.Display.create (Display.java: 805)org.eclipse.swt.graphics.Device (Device.java: 130)org.eclipse.swt.widgets.Display (Display.java: 696)org.eclipse.swt.widgets.Display (Display.java: 687)com.samples.swt.first.Main.main (Main.java: 8)
就我所知,我做的每件事都是正确的。为什么会出现这个错误?它说Display
必须在主线程上创建,据我所知,它是在主线程上创建的。然后继续讨论Exception in thread "main"
…
现在错误消失了,我从使用swt-debug.jar
切换到swt.jar
。如果有人知道为什么调试jar会导致这个错误,我很想知道…
在启动应用程序时需要有-XstartOnFirstThread
开关。SWT FAQ中的这个问题解释了原因。