我开始使用CheckThreadViolationRepaintManager
来检测EDT违规行为。
抱怨:
partner = getParameter("partner",generatePartnerSelectionPanel(),Design.partnerSelectionDuration);
因为它不喜欢generatePartnerSelectionPanel()
,因为它不喜欢此方法中的JPanel panel = new JPanel();
。但我无法找出为什么会出现问题。
更详细地说,generatePartnerSelectionPanel()
会生成一个JPanel(我不是在EDT中),但是在getParameter
我将JPanel添加到主JFrame中,我在EDT中执行此操作(使用invokeLater
)。
那么,为什么会出现问题?
答案 0 :(得分:3)
EDT违规并不意味着必然确实出错了,这意味着您尝试在除EDT之外的线程上执行GUI相关操作(某种情况可能< /我>出错了。)
创建一个新的Swing组件由“做一些与GUI相关的事情”,因此有关违规的警告。
这个forum has quite a discussion解释了为什么不建议在其他线程上创建Swing组件。
答案 1 :(得分:2)
如果您在main中传递给您的线程中创建任何GUI组件,通常会发生这种情况。
现在,实际上没有什么不好的事情发生,只要你在意识到它之后不进行修改(setVisible(true)
或pack()
将实现一个框架),但是太阳发现了一些优势他们声称这样做会导致问题。
所以要完全正确,让你的主要构建你的第一个窗口 invokeLater
或invokeAndWait
。
实际上,我想知道在invokeLater
之后是否退出你的主线程可能会让你的整个应用程序退出(因为窗口几乎肯定还没有时间出现)...你可能想要除非主线程没有退出,否则请使用invokeAndWait
。
答案 2 :(得分:0)
Swing是线程敌对的。即使未实现某个组件,它仍可以访问共享资源或调用EventQueue.invokeLater
。曾经有一段时间广泛宣称可以创建Swing组件,但这是不正确的。
答案 3 :(得分:0)
除了使用CheckThreadViolationRepaintManager
之外,我一直在使用面向方面的解决方案来检测何时从EDT构建任何Swing组件。如果您使用AspectJ,这是解决EDT违规问题的一种优雅方法。
有关详细信息,请参阅此博客文章: