2

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

它抱怨:

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

因为它不喜欢generatePartnerSelectionPanel(),因为它不喜欢JPanel panel = new JPanel();这种方法。但我不知道为什么应该有一个问题。

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

那么,为什么会有问题呢?

4

4 回答 4

4

EDT 违规并不意味着一定会出错,这意味着您尝试在 EDT 以外的线程上执行与 GUI 相关的操作(可能会出错的情况

“做一些与 GUI 相关的事情”涵盖了创建新的 Swing 组件,因此会发出有关违规的警告。

这个论坛有很多关于为什么不建议在其他线程上创建 Swing 组件的讨论。

于 2010-04-28T08:45:32.813 回答
2

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

现在,实际上,只要您在实现它(setVisible(true)pack()将实现一个框架)之后不修改它,就不会发生任何不好的事情,但是 Sun 发现了一些他们声称可以实现的边缘情况,因此这可能会导致问题。

因此,为了完全正确,让您的主构造您的第一个窗口在orinvokeLaterinvokeAndWait

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

于 2010-09-03T22:18:06.173 回答
1

Swing 是线程敌对的。即使一个组件没有实现,它仍然可以访问共享资源或调用EventQueue.invokeLater. 曾经有一段时间,人们普遍认为 Swing 组件可以创建出来,但这是不正确的。

于 2010-04-28T08:42:50.490 回答
0

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

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

调试 Swing,最终总结(来自 archive.org)

于 2010-09-03T21:50:31.483 回答