题
我开始使用 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违规进行故障排除的优雅方法。
有关详细信息,请参见此博客文章: