2 回答
TA贡献1887条经验 获得超5个赞
完整的Swing处理是在称为EDT(事件调度线程)的线程中完成的。因此,如果您要在此线程中进行一些长时间的计算,则会阻塞GUI。
此处的方法是在另一个线程中处理您的计算,因此您的GUI保持响应。最后,您需要更新您的GUI,这必须在EDT中完成。现在EventQueue.invokeLater开始发挥作用。它Runnable在Swings事件列表的末尾发布一个事件(您的),并在处理完所有先前的GUI事件之后进行处理。
也EventQueue.invokeAndWait可以在这里使用。所不同的是,您的计算线程将一直阻塞,直到您的GUI更新为止。因此很明显,不能在EDT中使用它。
注意不要从其他线程更新Swing GUI。在大多数情况下,这会产生一些奇怪的更新/刷新问题。
仍然有Java代码可以从主线程简单地启动JFrame。这可能会导致问题,但不能阻止它摇摆。现在,大多数现代IDE都会创建类似这样的内容来启动GUI:
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}
TA贡献1848条经验 获得超6个赞
所有受支持的平台都提供单线程图形库。摇摆是跨平台的。因此,Swing GUI对象应仅在事件分发线程上构造和操作。
顺便说SwingUtilities.invokeLater()一句,是EventQueue.invokeLater()自1.3版以来的封面。
添加回答
举报