本教程是针对JDK 8编写的。本页中描述的示例和实践未利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及后续版本中更新的语言功能的摘要,请参阅Java语言变更。
有关所有JDK版本的新功能、增强功能和已删除或不建议使用选项的信息,请参阅JDK发行说明。
Swing事件处理代码运行在一个特殊的线程上,称为事件派发线程。大多数调用Swing方法的代码也在这个线程上运行。这是必要的,因为大多数Swing对象方法都不是“线程安全”的:从多个线程调用它们会导致线程干扰或内存一致性错误。API规范中标记为“线程安全”的一些Swing组件方法可以从任何线程安全地调用。其他所有Swing组件方法必须从事件派发线程中调用。忽略此规则的程序可能大部分时间正常工作,但可能会出现难以复现的不可预测的错误。
有用的是,将在事件派发线程上运行的代码视为一系列短任务。大多数任务是事件处理方法的调用,例如ActionListener.actionPerformed
。其他任务可以由应用程序代码使用invokeLater
或invokeAndWait
进行调度。事件派发线程上的任务必须快速完成;如果没有完成,未处理的事件将积压,用户界面将变得不响应。
如果需要确定代码是否在事件派发线程上运行,请调用javax.swing.SwingUtilities.isEventDispatchThread
。