为什么Java中有两个Timer类(一个在javax.swing下,一个在java.util下)?

时间:2013-03-21 19:45:48

标签: java swing timer

我对此感到很困惑。 Java有两个Timer类,一个在swing下,一个在util下......为什么会这样?如果我想每Y秒运行一次X,我应该使用哪一个?这是否意味着如果我正在构建GUI,我必须使用swing版本作为计时器?

谢谢!

5 个答案:

答案 0 :(得分:31)

以下是javax.swing.Timer和java.util.Timer之间的区别:

javax.swing.Timer
  • 适合更简单的情况,使用少量的计时器(比如少于十几个)
  • 在事件派发线程上运行ActionListener对象
  • 可以直接更新GUI,而无需使用EventQueue.invokeLater
  • 如果任务完全在事件派发线程中运行(即,如果它没有产生工作线程),那么只有当任务不需要很长时间(比如300毫秒以下)时,GUI才会保持响应

java.util.Timer

  • 比javax.swing.Timer更具可扩展性,并具有其他日程安排功能
  • 在私有线程上运行TimerTask对象
  • 需要使用EventQueue.invokeLater来更新GUI

您可以通过两种方式使用Swing计时器:

  • 延迟后执行一次任务。 例如,工具提示管理器使用Swing计时器来确定何时显示工具提示以及何时隐藏它。
  • 重复执行任务。 例如,您可以执行动画或更新显示目标进度的组件。

以上是上述信息http://www.javapractices.com/topic/TopicAction.do?Id=160http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

的来源
  

如果我想每隔Y秒运行一次X,我应该使用哪一个?

取决于您与之交互的内容。如果您正在与GUI交互,请使用javax.swing.Timer,否则请使用java.util.Timer

  

这是否意味着如果我正在构建GUI,我必须使用swing版本   对于计时器?

YES

答案 1 :(得分:2)

Swing版本用于渲染swing组件。如果您只需要时间,请使用util。

答案 2 :(得分:2)

你是对的。如果您要进行受定时器影响的UI工作,建议您使用swing组件。 util计时器无法自行设置UI元素。 Here is a nice comparison

答案 3 :(得分:2)

  

在v 1.3中,另一个Timer类被添加到Java平台:   java.util.Timer中。它和javax.swing.Timer都提供相同的基本功能   功能,但java.util.Timer更通用,有更多   特征。 javax.swing.Timer有两个功能可以使它成为一个   GUI更容易使用。首先,它的事件处理比喻是   对GUI程序员来说很熟悉并可以处理   事件调度线程更简单一点。第二,它的自动线程   共享意味着您不必采取特殊措施来避免   产生太多线程。相反,您的计时器使用相同的线程   用于使光标闪烁,出现工具提示等。

     

您可以找到更多文档和几个使用示例   计时器通过访问如何使用计时器,这是“Java教程”中的一节。   有关更多示例和帮助选择此Timer类和   java.util.Timer,请参阅使用Swing应用程序中的计时器   Swing Connection。

来自official documentation

答案 4 :(得分:2)

如果你有一个简单,快速的任务需要与swing框架交互,那么使用javax.swing.Timer更简单

对于几乎所有其他情况 - 甚至GUI应用程序,您应该使用java.util.Timer 如果你有一个GUI,那么你必须处理与swing事件调度线程的集成,就像使用EventQueue.invokeLater更新GUI一样,任何其他任务都会如上所述

通常,当您启动时,前几个计时器事件可能看起来很快并且不太可能影响性能,但随着需求的变化,它们将花费更长时间,并且会出现更多,并且GUI本身的需求将会增长。通过在摆动环境之外启动来避免返工是一种更好的做法 - 否则您的GUI将很快出现“缓慢”或“无法使用”