Javax Swing Timers - 更改延迟时间

时间:2016-05-23 15:25:39

标签: java swing

我在这里学习了Java程序 https://www.utdallas.edu/~dheroy/4331code/book/ImageAudioAnimation.java

我注意到这个程序存在缺陷

private int[] delays =
    {48000, 54000, 59000, 54000, 59000, 31000, 68000};
private Timer timer = new Timer(delays[0], new TimerListener());

计时器初始化为延迟值[0]( 48000 ) 现在计时器在整个程序中都停留在此位置。甚至在我们调用这行代码之后

 timer.setDelay(delays[index]);

我正在尝试重写这个程序,让它做它想做的事情。我坚持让这个计时器从初始化时更改。自2012年以来,我没有在Java中工作过多,所以我对它有点生疏,特别是它的GUI方面。

我应该抛弃计时器对象并提出另一种跟踪已用时间的方法吗?

2 个答案:

答案 0 :(得分:3)

你需要做两件事:

  • 也设置初始延迟,否则计时器将等待最初指定的时间。
  • 重新启动计时器。

您可以像这样设置极低的延迟:

    timer.setInitialDelay(5);
    timer.setDelay(5);
    timer.restart();

答案 1 :(得分:2)

引用docs

  

Swing计时器(javax.swing.Timer的一个实例)触发一个或多个   指定延迟后的动作事件。不要混淆Swing计时器   使用java.util包中的通用计时器工具。这个   页面仅描述Swing计时器。

     

一般情况下,我们建议使用Swing计时器而不是   用于GUI相关任务的通用计时器,因为Swing计时器全部   共享相同的,预先存在的计时器线程和GUI相关的任务   自动在事件派发线程上执行。但是,你   如果你不打算触摸,可能会使用通用计时器   来自计时器的GUI,或者需要执行冗长的处理。

Bottomline,如果你的javax.swing.Timer对GUI产生影响,请继续使用它。 否则,您可能需要调查ScheduledThreadPoolExecutor

针对您的特定变量延迟问题,您可以参考API

  

[调用setDelay]不会影响初始延迟属性,   可以通过setInitialDelay方法设置。