执行一次后停止摆动计时器

时间:2013-05-05 06:46:41

标签: java swing timer repeat

在我正在制作的游戏中,我有一个功能,我只想在10秒内看到然后消失。因此,无论何时加电,我都会运行一个摆动Timer,将其初始延迟设置为10秒(10_000),并且我还将重复设置为假,因此它应该只运行一次。

每当我第一次接通电源时,它只能按照预期显示10秒,但是当我再次获得它时,它将只能随机显示一段时间(但从不超过10秒),因此它看起来像它确实重演了。那么当setRepeats(false);不起作用时,我怎样才能使它停止运行一次?

这是您上电时会发生什么的代码。

if(!power.getPowerUp()){
 double xAirdrop = xSize - 500;
 double yAirdrop = ySize - 500;
 power.setX(Math.random() * xAirdrop + 64);
 power.setY(Math.random() * yAirdrop + 150);
 power.setPowerUp(true);
 Timer powerTimer = new Timer(10_000, new ActionListener(){
  public void actionPerformed(ActionEvent e){
   power.setPowerUp(false);  
   power.setWidth(power.getCrate().getWidth(null) + 250);
   power.setHeight(power.getCrate().getHeight(null) + 250);
  }
 });
 powerTimer.setInitialDelay(10_000);
 powerTimer.setRepeats(false);
 powerTimer.start();
}

1 个答案:

答案 0 :(得分:2)

问题是你的计时器仍在运行,即使它没有触发事件,因此当你运行start()时它就在周期中间的某个地方。这导致它运行的时间短于10秒。您需要在后续运行中运行restart()而不是start()。它甚至可能适用于第一次运行。

 powerTimer.setInitialDelay(10_000);
 powerTimer.setRepeats(false);
 powerTimer.restart();

来自javadoc:

  

重新启动()             重新启动计时器,取消任何待处理的点火并使其在初始延迟时触发。

http://docs.oracle.com/javase/6/docs/api/javax/swing/Timer.html#restart()