我使用SWT编写了一个跨平台应用程序。在Mac上,它会抛出SWTException
Illegal thread access
。
有many answers which say to use -XstartOnFirstThread
但是,使用它真的很不方便。不得不说
令人沮丧要运行该应用程序,只需双击该程序,除非您使用Mac。如果您使用Mac,请打开终端,然后运行以下命令。如果它们不起作用,请参阅这些有关如何配置PATH和JAVA_HOME的说明
有没有办法在不使用-XstartOnFirstThread
的情况下在Java中修复此问题?
答案 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,并因为您的应用程序再次跨平台而欢呼雀跃。