1

我正在编写一个 Java 7 Swing 应用程序,它调用一个非 GUI 类来循环执行某些操作。不幸的是,循环运行时我无法与 GUI 交互。是否可以在该循环中强制处理 GUI 事件?

我正在寻找可以告诉 JVM 在继续循环之前处理其他 GUI 事件(例如按钮单击)的东西。

Java 7 Swing 中是否有一些东西可以满足我的需求,或者我真的必须自己处理多线程(我还没有那么远......)?

4

2 回答 2

7

不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用实现重复任务Thread.sleep(n)的 Swing或长时间运行的任务。有关更多详细信息,请参阅Swing 中的并发。TimerSwingWorker

于 2013-06-30T14:21:15.817 回答
5

使用SwingWorker。基本上,所有 UI 事件处理总是在单个特定线程上完成,称为事件调度线程,并且在该线程中执行任何其他操作都会阻止 UI 事件(鼠标单击、键盘输入等)被处理,从而使 UI “挂起” .

该类SwingWorker被添加到 JRE 中,专门用于“在后台”(而不是在 UI 线程中)执行耗时的任务,并允许您轻松地在其他地方完成繁重的工作,可选择每隔一段时间更新 UI(想想进度条),并且,在你完成后,再次可选地更新 UI。您只需通过覆盖特定方法 (doInBackground()done()) 即可做到这一点,并且您永远不需要直接处理线程。

SwingWorker Javadoc 页面包含开始使用它所需的一切,包括示例代码。

于 2013-06-30T14:17:25.223 回答