14

来自Java 教程

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

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

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

4

3 回答 3

12

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

但是,在页面的后面,他们说如果您有一个复杂的并发应用程序,请查看SwingWorker 类并了解有关swing 的并发性

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

在 SwingWorker 中,您将了解到多线程 Swing 应用程序有两个主要问题:

  • 不应在事件调度线程上运行耗时的任务。否则应用程序变得无响应。

    Swing 组件只能在 Event Dispatch Thread 上访问。

于 2013-01-22T16:19:33.473 回答
8

回答您的具体问题。

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

是的,流畅的动画需要 Timer。

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

显然,您可以在动画循环之外进行的计算越多越好。在现代个人电脑上渲染一个面板只需要几毫秒。计算面板,很容易花费超过 25 毫秒。

因此,对于一分钟的动画,您需要 2,400 个面板。预先计算这些面板,并仅渲染它们,将导致更平滑的动画。

于 2013-01-22T17:24:25.673 回答
6

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

这也取决于你的延迟Timer。如果它每 50 毫秒运行一次,那么运行 30 毫秒的任务就会变慢。但是,如果您的任务每 5-10 分钟运行一次,只运行 30 毫秒,那么它是可以接受的。您将不得不运行一些测试来查看您Timer是否对您的应用程序有任何明显的影响。

查看本文以获取有关 EDT 的更多信息。此外,这个答案提供了很多关于如何使用SwingWorker对象的信息。

于 2013-01-22T16:27:05.523 回答