找不到平台/调度线程上的UI代码

时间:2013-09-07 14:51:18

标签: java swing user-interface javafx ui-thread

我目前正在尝试调试中等规模(在成千上万行中的10个行球场)使用JavaFX和Swing的Java项目,我经常遇到一些奇怪的例外,我很确定是因为没有在正确的线程上调用UI代码。这些异常的堆栈跟踪根本不是很有用,因为它们几乎全部来自UI绘图线程。

现在,确定我可以坐下来使用牙齿并调试每个UI调用,直到我发现一个没有在正确的线程上调用,并继续为整个项目执行此操作,但这将是一个非常长的任务。是否有某种形式的简单方法来进行这种调试?例如,某种程度上导致UI代码打印出调试消息,或者在没有从相应的线程调用时抛出异常?

2 个答案:

答案 0 :(得分:3)

在同一个线程上运行JavaFX和Swing可能有助于修复线程问题。

Java 8中有一个实验性功能,可以在同一个线程上运行JavaFX和Swing:

https://javafx-jira.kenai.com/browse/RT-30694 http://bugs.sun.com/view_bug.do?bug_id=8015477

我认为-Djavafx.embed.singleThread=true是启用实验单线程系统的命令行属性设置。

我不确定experimental featurecurrent Java 8 builds是否可用,但我认为现在可能会这样,所以您可能希望尝试一下。

如果您需要有关实验性单线程功能的更多信息,可以在openjfx-dev mailing list上询问开发人员。


Java 8有更好的内置报告,当代码没有在正确的线程上运行时,它并不全面,但可能可以帮助您找到错误的来源,即使您没有使用单线程选项。


运行合并Swing和JavaFX的大型应用程序的其他一些用户报告了类似的难以调试的线程问题,因此您可以检查threads以查看您的问题是否具有相同的原因。

答案 1 :(得分:3)

您可以通过-Dglass.disableThreadChecks=false打开玻璃中的线程检查。这将在JavaFX的最低层开启线程检查,JavaFX负责使用OS级API。在大多数情况下,这些检查就足够了,因为大多数调用都以Glass结尾。默认情况下,这些检查很快就会启用。