java - 定位不在平台/调度线程上的 UI 代码

标签 java swing user-interface javafx ui-thread

我目前正在尝试调试同时使用 JavaFX 和 Swing 的中等规模(大约数千行)Java 项目,并且我经常遇到一些奇怪的异常,我很确定因为没有在正确的线程上调用 UI 代码。这些异常的堆栈跟踪根本没有用,因为它们几乎都源自 UI 绘图线程。

现在,我当然可以坐下来用梳子调试每个 UI 调用,直到找到一个未在正确线程上调用的调用,然后在整个项目中继续这样做,但那将是一项极其漫长的任务。有没有更简单的方法来进行这种调试?例如,以某种方式导致 UI 代码在未从相应线程调用时打印出调试消息或抛出异常?

最佳答案

在同一线程上运行 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查看您的问题是否有相同的原因。

关于java - 定位不在平台/调度线程上的 UI 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18674514/

相关文章:

java - 如何为我的 Java 程序获得最佳视觉输出

android - 从服务中的线程更改主 Activity 用户界面

java - 打开编辑器时如何正确设置 Eclipse 插件中 IFile 的内容

java - 如何使用java卡apdu从智能卡写入和读取数据

java - 从 mysql 数据库检索泰米尔字符并将其显示到浏览器

java - 在数组中为菜单创建对象

java - 创建一个方法来处理所有类型的 Swing 组件

java - 使用 FlexJson、Jackson、GSON 等保留字段名称

java - 无法使用按钮实例化类

java - 每次做出错误的猜测时,我都需要让我的程序向 GUI 添加一个 .jpg。