我正在编写一个 Java 7 Swing 应用程序,它调用一个非 GUI 类来循环执行某些操作。不幸的是,循环运行时我无法与 GUI 交互。是否可以在该循环中强制处理 GUI 事件?
我正在寻找可以告诉 JVM 在继续循环之前处理其他 GUI 事件(例如按钮单击)的东西。
Java 7 Swing 中是否有一些东西可以满足我的需求,或者我真的必须自己处理多线程(我还没有那么远......)?
不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用实现重复任务Thread.sleep(n)
的 Swing或长时间运行的任务。有关更多详细信息,请参阅Swing 中的并发。Timer
SwingWorker
使用SwingWorker。基本上,所有 UI 事件处理总是在单个特定线程上完成,称为事件调度线程,并且在该线程中执行任何其他操作都会阻止 UI 事件(鼠标单击、键盘输入等)被处理,从而使 UI “挂起” .
该类SwingWorker
被添加到 JRE 中,专门用于“在后台”(而不是在 UI 线程中)执行耗时的任务,并允许您轻松地在其他地方完成繁重的工作,可选择每隔一段时间更新 UI(想想进度条),并且,在你完成后,再次可选地更新 UI。您只需通过覆盖特定方法 (doInBackground()
和done()
) 即可做到这一点,并且您永远不需要直接处理线程。
SwingWorker Javadoc 页面包含开始使用它所需的一切,包括示例代码。