我正在编写一个Java7 Swing应用程序,它调用非GUI类在循环中执行某些操作。不幸的是,当循环运行时,我不能与GUI交互。是否可以在该循环中强制处理GUI事件?
我正在搜索一些东西,告诉JVM在继续循环之前处理其他GUI事件,比如按钮单击。
Java 7 Swing中有没有我想要的东西,或者我真的必须自己处理多线程(我还没走那么远……)?
发布于 2013-06-30 22:21:16
不要阻塞EDT (事件调度线程)-当这种情况发生时,GUI将“冻结”。实现一个用于重复任务的Swing Timer或一个用于长时间运行的任务的SwingWorker,而不是调用Thread.sleep(n)。有关更多详细信息,请参阅Concurrency in Swing。
发布于 2013-06-30 22:17:25
使用SwingWorker。基本上,所有UI事件处理总是在单个特定的线程上完成,称为事件调度线程,在该线程中执行任何其他操作都会阻止UI事件(鼠标单击、键盘输入等)被处理,从而使UI“挂起”。
SwingWorker类被添加到JRE中,专门用于“在后台”(而不是在UI线程中)执行耗时的任务,它允许您轻松地在其他地方执行繁重的任务,可以有选择地以一定的时间间隔更新UI (考虑进度条),也可以在完成后更新UI。您只需覆盖特定的方法(doInBackground()和done())就可以做到这一点,而不需要直接处理线程。
SwingWorker Javadoc page提供了开始使用它所需的一切,包括示例代码。
https://stackoverflow.com/questions/17391239
复制相似问题