1

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

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

我试过 Thread.sleep 但我读到不鼓励这样做。

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

4

2 回答 2

4

注意事项:

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

javax.swing.Timer

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

摇摆工人

SwingWorker是一种解决方案,旨在通过提供在后台运行代码的机制,同时提供简单(至少更简单)的机制来同步 EDT 内的 UI 更新,从而使 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...
    }

}

查看...

更多细节...

于 2013-07-03T00:55:38.607 回答
4

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

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

于 2013-07-03T00:41:40.810 回答