我正在编写一个Java 7 Swing应用程序,该应用程序调用非GUI类来循环执行某些操作。不幸的是,在循环运行时我无法与GUI交互。是否可以在该循环中强制处理GUI事件?
我正在寻找一些东西,告诉JVM在继续循环之前处理其他GUI事件,例如按钮点击。
Java 7 Swing中是否存在我想做或想做的事情我自己真的要乱用多线程(我还没那么远......)?
答案 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拥有开始使用它所需的一切,包括示例代码。