Swing的计时器中“quick”的含义是什么?

时间:2013-01-22 16:17:46

标签: java swing timer timertask

来自Java tutorial

  

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

“快速”是什么意思?我的意思是不准确,不到一分钟很快或者是什么?

例如,如果我想用一些面板制作动画(1分钟),通过移动它们,改变它们的透明度......用户只是要看面板而不能使用它们(没有I / O),现在Timer对于这种情况是个好主意吗?

3 个答案:

答案 0 :(得分:12)

这意味着 - 它应该是快速的,因为 - 几乎没有可见的延迟

但是,稍后在页面中他们会说如果您有一个复杂且并发的应用程序,请查看SwingWorker类并了解concurrency in regards to swing

关注的不一定是一切运行得多快,而是它的顺序正确。

在SwingWorker中,您会发现多线程Swing应用程序存在两个主要问题:

  
      
  • 不应在Event Dispatch Thread上运行耗时的任务。否则应用程序将无响应。

         

    应仅在Event Dispatch Thread上访问Swing组件。

  •   

答案 1 :(得分:8)

回答您的具体问题。

  

如果我想用一些面板制作动画(1分钟),通过移动它们,改变它们的透明度......并且用户只是要看面板而不能使用它们(不是我/ O),现在Timer对于这种情况是个好主意吗?

是的,平滑动画需要一个Timer。

假设您希望每秒显示40帧。这意味着你有25毫秒准备和显示每个面板。

显然,你可以在动画循环之外移动的计算越多越好。现代个人计算机上只需几毫秒即可渲染面板。计算面板,可以轻松地花费超过25毫秒。

所以,对于一分钟的动画,你需要2,400个面板。预先计算这些面板,然后只渲染它们,将导致更平滑的动画。

答案 2 :(得分:6)

在此上下文中, quick 没有固定的时间限制。但是,您应该假设任何花费超过几十毫秒的任务通常不会被视为快速。请注意,在EDT上运行的任何代码都可能会在应用程序的GUI中产生各种问题。这就是为什么文档建议您改为使用SwingWorker

这还取决于Timer的延迟。如果它每50ms运行一次,那么运行30ms的任务就会变慢。但是,如果您的任务每5-10分钟运行一次仅30分钟,则可以接受。您必须运行一些测试,以查看您的Timer是否对您的应用程序产生了明显的影响。

检查此article以获取有关EDT的更多信息。此外,此answer提供了有关如何使用SwingWorker对象的大量信息。