我开始使用 CheckThreadViolationRepaintManager 检测EDT违规行为。

它抱怨:

partner = getParameter("partner",generatePartnerSelectionPanel(),Design.partnerSelectionDuration);

因为它不喜欢 generatePartnerSelectionPanel() 因为它不喜欢 JPanel panel = new JPanel(); 在这种方法中。但是我找不到为什么应该有问题。

在更多详细信息中 generatePartnerSelectionPanel() 生成jpanel(我不在EDT中这样做),但是在 getParameter 我将jpanel添加到主jframe中,然后在EDT中进行(使用 invokeLater).

那么,为什么应该有问题?

有帮助吗?

解决方案

EDT违规并不意味着一定意味着 做过 出错,这意味着您尝试在EDT以外的其他线程上采取与GUI相关的操作(这种情况 可能 出错)。

创建新的挥杆组件被“与GUI相关的事情”所涵盖,因此警告违规。

这个 论坛有一个讨论 关于为什么不建议在其他线程上创建摆动组件。

其他提示

通常,如果您在主要交给您的线程中创建任何GUI组件,则会发生这种情况。

现在,实际上,只要您意识到它,只要您不修改它,就不会发生任何不好的事情(setVisible(true) 或者 pack() 会意识到一个框架),但是太阳发现了他们声称这样做的一些边缘案例,这可能会引起问题。

因此,要完全正确,请您的主要构造您的第一个窗口 里面 一个 invokeLater 或者 invokeAndWait.

实际上,我想知道是否在 invokeLater 可能会允许您的整个应用程序退出(因为窗口几乎肯定还没有时间出现)...您可能想使用 invokeAndWait 除非您的主线程未退出。

秋千是螺纹敌对的。即使没有实现组件,它仍然可以访问共享资源或呼叫 EventQueue.invokeLater. 。在某个时期,人们广泛地指出可以从秋千组件中创建秋千组件,但这是不正确的。

除了使用 CheckThreadViolationRepaintManager 我一直在使用面向方面的解决方案来检测何时从EDT构造出任何摆动组件。如果您使用extackJ,这是对EDT违规进行故障排除的优雅方法。

有关详细信息,请参见此博客文章:

调试秋千,最后的摘要

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top