【发布时间】:2014-04-27 09:07:03
【问题描述】:
我很好奇为什么要使用java.awt.EventQueue.invokeLater来控制swing组件。
为什么我们不能在普通线程中这样做?幕后究竟发生了什么?从我注意到的情况来看,如果我有JFrame,我可以从主线程将可见性设置为真或假而不会出现任何错误,而且它似乎确实有效。那么使用java.awt.EventQueue.invokeLater 究竟能达到什么目的呢?我也完全知道我可以使用SwingUtilities.invokeLater,但作为explained here,它们似乎是一回事。
感谢任何人的解释。希望这是一个有效的问题。
编辑:回答 wumpz 问题 我们可以创建一个jframe
JFrame frame = new JFrame("Hello world");
frame.setSize(new Dimension(300, 300));
frame.setPreferredSize(new Dimension(300, 300));
frame.setMaximumSize(new Dimension(300, 300));
frame.setMinimumSize(new Dimension(300, 300));
frame.setVisible(true);
frame.pack();
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
在创建它的同一线程上执行以下操作。
for (int i = 0; i < 34; i++)
{
System.out.println("Main thread setting to "+(!frame.isVisible()));
frame.setVisible(!frame.isVisible());
}
没有抱怨。
【问题讨论】:
-
为什么现在允许在普通线程中执行此操作?有什么例外吗?
-
它之所以有效,是因为你很幸运——而且众所周知,线程竞赛很难重现。该程序可能看起来可以正常工作,但这并不意味着它没有错误。在 EDT 之外创建和修改组件会破坏线程规则,但破损不一定是可见的。程序越大,在某些系统和某些 java 版本上,它有时开始表现不佳的可能性就越大。
-
@wumpz,阅读 Concurrency 上的 Swing 教程部分以获得更完整的解释。
标签: java swing asynchronous event-handling