如何使用SwingWorker和/或Timer?

时间:2013-07-03 00:39:22

标签: java swing user-interface timer swingworker

我一直致力于某个计划,目前正在努力解决问题。该程序的目的是从数据库中读取记录,在某个触发器上提取信息,然后在GUI中显示该信息。这里的问题是从数据库中获取数据以显示在GUI中,允许一段时间在屏幕上显示,然后对下一个执行相同的操作并循环。

我可以获取数据并将其放在GUI的屏幕上,但我的问题在于允许暂停。

我已经尝试过Thread.sleep,但我已经读到这样做是不鼓励的。

似乎建议使用SwingWorker和/或Timer。我花了很多时间研究这两个,但我很难完全理解它并能够将它应用到我的程序中。鉴于我的问题和我的程序的目的,任何人都可以帮助解释SwingWorker和Timer的重要性吗?

2 个答案:

答案 0 :(得分:4)

计时器在EDT中执行,SwingWorker在另一个线程中工作。我非常喜欢这个例子Swing Worker example

  

请注意,Swing计时器的任务是在事件发送中执行的   线。这意味着任务可以安全地操作组件,但是   它还意味着任务应该快速执行。如果任务可能   需要一段时间才能执行,然后考虑使用SwingWorker而不是   或者除了计时器之外。

答案 1 :(得分:4)

注意事项:

与UI,更新,创建的所有交互都应该在事件调度线程的上下文中完成。

javax.swing.Timer中

Swing Timer是一个特殊的计时器,允许您设置定期回调,保证在EDT的上下文中执行

的SwingWorker

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...
    }

}

退房......

了解更多详情......