10

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

谢谢!

4

5 回答 5

31

这里是 javax.swing.Timer 和 java.util.Timer 的区别:

javax.swing.Timer
  • 适用于更简单的情况,使用少量计时器(比如少于十几个)
  • 在事件调度线程上运行 ActionListener 对象
  • 可以直接更新 GUI,无需使用 EventQueue.invokeLater
  • 如果任务完全在事件调度线程中运行(也就是说,如果它没有产生工作线程),那么 GUI 将仅在任务不花费很长时间(比如 300 毫秒以下)时保持响应

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 版本的计时器?

是的

于 2013-03-21T19:57:54.243 回答
2

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

于 2013-03-21T19:49:03.430 回答
2

你说的有点对。建议如果你要做的 UI 工作会受到计时器的影响,你应该使用 swing 组件。util timer 不能自行设置 UI 元素。这是一个很好的比较

于 2013-03-21T19:49:11.900 回答
2

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

您可以通过访问 The Java Tutorial 中的 How to Use Timers 部分找到更多文档和几个使用计时器的示例。有关在此 Timer 类和 java.util.Timer 之间进行选择的更多示例和帮助,请参阅在 Swing 应用程序中使用计时器,这是 Swing Connection 中的一篇文章。

来自官方文档

于 2013-03-21T19:50:19.743 回答
2

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

对于几乎所有其他情况 - 即使是 GUI 应用程序,您也应该使用 java.util.Timer 如果您有 GUI,那么您必须以与使用 EventQueue.invokeLater 更新 GUI 的任何其他任务相同的方式处理与 swing 事件调度线程的集成正如刚才提到的

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

于 2013-11-07T19:56:34.100 回答