在Mac上运行SWT应用程序会引发非法线程访问

时间:2016-01-04 15:55:37

标签: java macos swt

我使用SWT编写了一个跨平台应用程序。在Mac上,它会抛出SWTException Illegal thread access

many answers which say to use -XstartOnFirstThread

但是,使用它真的很不方便。不得不说

令人沮丧
  

要运行该应用程序,只需双击该程序,除非您使用Mac。如果您使用Mac,请打开终端,然后运行以下命令。如果它们不起作用,请参阅这些有关如何配置PATH和JAVA_HOME的说明

有没有办法在不使用-XstartOnFirstThread的情况下在Java中修复此问题?

1 个答案:

答案 0 :(得分:1)

实际上有一种方法可以在主线程上以编程方式运行SWT的readAndDispatch,而无需使用命令行选项。在谈论SWT时,一般不会经常提及它,甚至更少提及。我刚刚发现了这一点,这是一个救生员。

com.apple.concurrent.Dispatch仅存在于Mac上,可以生成Executor,允许将任务提交到主线程。使用此功能,可以创建跨平台的SWT应用程序,该应用程序始终会双击打开。

当然,因为Windows / Linux上不存在该类,所以不能简单地直接调用所需的方法。如果您执行,您的应用程序将在{/ 1}}的Windows / Linux上失败。相反,只有当前操作系统是Mac时,您才需要使用一些反射在主线程上运行ClassNotFoundException

您需要检查操作系统是否为Mac。为此,您可以使用以下代码。

readAndDispatch

之后,您可以使用反射来调用必要的方法。

if (System.getProperty("os.name").toLowerCase().contains("mac"))

最后,您可以在执行程序中执行runnable,并因为您的应用程序再次跨平台而欢呼雀跃。