我有一个带有单个类的早期 Java Web Start 应用程序。它在 Windows 和 Linux 上运行,但在 Mac OS X 上会出现可怕的 Invalid Thread Access 错误。我意识到这已经在其他地方处理过。我花了整整两天时间在互联网上搜索并实施了所有解决方案,但问题仍然存在。
我的理解是对 SWT 的调用必须从主线程进行,这里就是这种情况。如果我错了,请纠正我。
我将在下面发布 3 个片段,应用程序的源代码、jnlp 文件的相关部分以及 Mac 上的错误消息。问题在最后。
JAVA源代码
package client;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class AccountWindow {
public static void main(String[] args) {
Display display = new Display(); **// error occurs here**
Shell shell = new Shell(display); shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
JNLP 片段
<resources os="Mac\ OS\ X" arch="x86_64">
<j2se version="1.5+" java-vm-args="-XstartOnFirstThread" />
<nativelib href="swt-4.2-cocoa-macosx-x86_64.jar" />
</resources>
错误信息
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.widgets.Display.error(Unknown Source)
at org.eclipse.swt.widgets.Display.createDisplay(Unknown Source)
at org.eclipse.swt.widgets.Display.create(Unknown Source)
at org.eclipse.swt.graphics.Device.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
at client.AccountWindow.main(AccountWindow.java:16)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.javaws.Launcher.executeApplication(Launcher.java:1550)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:1488)
at com.sun.javaws.Launcher.doLaunchApp(Launcher.java:1299)
at com.sun.javaws.Launcher.run(Launcher.java:114)
at java.lang.Thread.run(Thread.java:637)
请注意- http://www.eclipse.org/swt/faq.php#javawebstart
上
发布的 display.syncExec 解决方案不适用,因为在调用它之前,您需要一个显示。当我尝试创建显示时,会发生这里的错误。
- 我已经使用 JaNeLa 来验证 jnlp 文件并且没有红色错误。
- <resources os="Mac\ OS\ X" arch="i386"> 被正确解释,因为正在加载正确的 swt 库。- 您可以在http://thelinkjuicer.com/gannonline/client.jnlp
重现错误
现在的问题
任何人都可以在源代码或 jnlp 片段中看到任何会导致错误的内容吗?
第二个问题:如何判断 -XstartOnFirstThread 参数是否实际上被 VM 读取?