我一直致力于某个计划,目前正在努力解决问题。该程序的目的是从数据库中读取记录,在某个触发器上提取信息,然后在GUI中显示该信息。这里的问题是从数据库中获取数据以显示在GUI中,允许一段时间在屏幕上显示,然后对下一个执行相同的操作并循环。
我可以获取数据并将其放在GUI的屏幕上,但我的问题在于允许暂停。
我已经尝试过Thread.sleep,但我已经读到这样做是不鼓励的。
似乎建议使用SwingWorker和/或Timer。我花了很多时间研究这两个,但我很难完全理解它并能够将它应用到我的程序中。鉴于我的问题和我的程序的目的,任何人都可以帮助解释SwingWorker和Timer的重要性吗?
答案 0 :(得分:4)
计时器在EDT中执行,SwingWorker在另一个线程中工作。我非常喜欢这个例子Swing Worker example
请注意,Swing计时器的任务是在事件发送中执行的 线。这意味着任务可以安全地操作组件,但是 它还意味着任务应该快速执行。如果任务可能 需要一段时间才能执行,然后考虑使用SwingWorker而不是 或者除了计时器之外。
答案 1 :(得分:4)
与UI,更新,创建的所有交互都应该在事件调度线程的上下文中完成。
Swing Timer是一个特殊的计时器,允许您设置定期回调,保证在EDT的上下文中执行
SwingWorker
是一种解决方案,它通过提供在后台运行代码的机制,同时提供简单(至少更简单)的机制来同步EDT内的UI更新,从而使UI开发人员的生活更轻松。
对于您的问题,我建议您使用SwingWorker
,因为您可以在后台暂停而不会影响用户界面的响应能力
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...
}
}
退房......
了解更多详情......