在循环中处理其他GUI事件

时间:2013-06-30 14:14:10

标签: java swing

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

我正在寻找一些东西,告诉JVM在继续循环之前处理其他GUI事件,例如按钮点击。

Java 7 Swing中是否存在我想做或想做的事情我自己真的要乱用多线程(我还没那么远......)?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

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

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

SwingWorker Javadoc page拥有开始使用它所需的一切,包括示例代码。