繁体   English   中英

如何利用SwingWorker和/或计时器?

[英]How to utilize SwingWorker and/or Timer?

我一直在研究程序,目前正在尝试解决问题。 该程序的目的是从数据库中读取记录,在某个触发器上提取信息,然后在GUI中显示该信息。 这里的问题是使数据库中的数据出现在GUI中,让它在屏幕上显示一段时间,然后对下一个进行同样的操作并循环浏览。

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

我已经尝试过Thread.sleep,但是我不建议这样做。

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

计时器在EDT中执行,而SwingWorker在另一个线程中进行工作。 我真的很喜欢这个示例Swing Worker示例

请注意,Swing计时器的任务是在事件分发线程中执行的。 这意味着任务可以安全地操作组件,但是也意味着任务应该快速执行。 如果任务可能需要一段时间才能执行,请考虑使用SwingWorker代替计时器或在计时器之外使用。

注意事项:

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

javax.swing.Timer

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM