代码之家  ›  专栏  ›  技术社区  ›  Thomas Owens

如何创建一个javax.swing.timer,它会立即触发,然后每隔t毫秒触发一次?

  •  4
  • Thomas Owens  · 技术社区  · 15 年前

    现在,我有了类似这样的代码:

    Timer timer = new javax.swing.Timer(5000, myActionEvent);
    

    根据我看到的(和 Javadocs for the Timer class ,计时器将等待5000毫秒(5秒),激发操作事件,等待5000毫秒,再次激发,等等。但是,我试图获得的行为是计时器启动,事件被激发,计时器等待5000毫秒,再次激发,然后在再次激发之前等待。

    除非我错过了什么,否则我找不到一种方法来创建一个不等待开火的计时器。有没有一个好的,干净的方法来模仿这个?

    4 回复  |  直到 15 年前
        1
  •  10
  •   asalamon74    15 年前

    只能在构造函数中指定延迟。您需要更改初始延迟(触发第一个事件之前的时间)。不能在构造中设置,但可以使用 setInitialDelay Timer类的方法。

    如果在第一次开火前不需要等待:

    timer.setInitialDelay(0);
    
        2
  •  2
  •   Tom Neyland    15 年前

    我不确定这是否会有很大帮助,但是:

    Timer timer = new javax.swing.Timer(5000, myActionEvent){{setInitialDelay( 0 );}};
    
        3
  •  0
  •   Joachim Sauer    15 年前

    我根本不会用计时器,而是用 ScheduledExecutorService

    import java.util.concurrent.*
    
    ...
    
    ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
    executor.scheduleAtFixedRate(myRunnable, 0, 5, TimeUnit.SECONDS);
    

    请注意有 scheduleAtFixedRate() scheduleWithFixedDelay() 它们的语义稍有不同。阅读JavaDoc并找出您需要哪一个。

        4
  •  0
  •   Bombe    15 年前

    简单解决方案:

    Timer timer = new javax.swing.Timer(5000, myActionEvent);
    myActionEvent.actionPerformed(new ActionEvent(timer, 0, null));
    

    但我喜欢 timer. setInitialDelay (0) 好多了。