为什么会发生EDT违规?

时间:2010-04-28 08:30:04

标签: java edt

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

抱怨:

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

因为它不喜欢generatePartnerSelectionPanel(),因为它不喜欢此方法中的JPanel panel = new JPanel();。但我无法找出为什么会出现问题。

更详细地说,generatePartnerSelectionPanel()会生成一个JPanel(我不是在EDT中),但是在getParameter我将JPanel添加到主JFrame中,我在EDT中执行此操作(使用invokeLater)。

那么,为什么会出现问题?

4 个答案:

答案 0 :(得分:3)

EDT违规并不意味着必然确实出错了,这意味着您尝试在除EDT之外的线程上执行GUI相关操作(某种情况可能< /我>出错了。)

创建一个新的Swing组件由“做一些与GUI相关的事情”,因此有关违规的警告。

这个forum has quite a discussion解释了为什么不建议在其他线程上创建Swing组件。

答案 1 :(得分:2)

如果您在main中传递给您的线程中创建任何GUI组件,通常会发生这种情况。

现在,实际上没有什么不好的事情发生,只要你在意识到它之后不进行修改(setVisible(true)pack()将实现一个框架),但是太阳发现了一些优势他们声称这样做会导致问题。

所以要完全正确,让你的主要构建你的第一个窗口 invokeLaterinvokeAndWait

实际上,我想知道在invokeLater之后是否退出你的主线程可能会让你的整个应用程序退出(因为窗口几乎肯定还没有时间出现)...你可能想要除非主线程没有退出,否则请使用invokeAndWait

答案 2 :(得分:0)

Swing是线程敌对的。即使未实现某个组件,它仍可以访问共享资源或调用EventQueue.invokeLater。曾经有一段时间广泛宣称可以创建Swing组件,但这是不正确的。

答案 3 :(得分:0)

除了使用CheckThreadViolationRepaintManager之外,我一直在使用面向方面的解决方案来检测何时从EDT构建任何Swing组件。如果您使用AspectJ,这是解决EDT违规问题的一种优雅方法。

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

Debugging Swing, the final summary