[英]How to utilize SwingWorker and/or Timer?
我一直在研究程序,目前正在尝试解决问题。 该程序的目的是从数据库中读取记录,在某个触发器上提取信息,然后在GUI中显示该信息。 这里的问题是使数据库中的数据出现在GUI中,让它在屏幕上显示一段时间,然后对下一个进行同样的操作并循环浏览。
我可以获取数据并将其放在GUI的屏幕上,但是我的问题在于允许该暂停。
我已经尝试过Thread.sleep,但是我不建议这样做。
似乎建议使用SwingWorker和/或Timer。 我花了很多时间研究这两者,但是我很难完全理解它们并将其应用到我的程序中。 鉴于我的问题和程序的目的,有人可以帮助解释SwingWorker和Timer的重要性吗?
计时器在EDT中执行,而SwingWorker在另一个线程中进行工作。 我真的很喜欢这个示例Swing Worker示例
请注意,Swing计时器的任务是在事件分发线程中执行的。 这意味着任务可以安全地操作组件,但是也意味着任务应该快速执行。 如果任务可能需要一段时间才能执行,请考虑使用SwingWorker代替计时器或在计时器之外使用。
与UI的所有交互,更新,创建都应在事件调度线程的上下文内完成。
Swing计时器是一种特殊的计时器,可让您设置定期回调,以确保在EDT上下文中执行
SwingWorker
是一种解决方案,旨在通过提供在后台运行代码的机制来使UI开发人员的生活更轻松,同时提供简单(至少更容易)的机制来同步EDT中对UI的更新。
对于您的问题,我建议您使用SwingWorker
,因为您可以在后台暂停而不影响UI的响应能力
SwingWorker worker = new SwingWorker<Object, Object> {
public void doInBackground() throws Exception {
while (!loadingDone) {
Object data = loadMoreData();
publish(data);
}
// This only matter if you actually care about the result
// of what has being processed here...
return null;
}
public void process(List<Object> chunks) {
// Now in the UI...
}
}
查看...
更多细节...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.