2015-05-28 3 views
1

Я попытался остановить таймер, но я не справился с этим. Мне нужно остановить таймер, когда метка покидает экран (x < 0) и снова запустите таймер, чтобы переместить ярлык справа налево.Как остановить таймер?

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    for(int i=0;i<10;i++){ 
     x=365; //horizontal position 
     while(x>0){ 
     randPosition=(int) (Math.random() * 365); // random vertical position 
     y=randPosition; 
     timer=new Timer(50,new ActionListener() { 

      public void actionPerformed(ActionEvent ae) { 
      jLabel1.setLocation(x,y); 
      rand=(int)(Math.random()*10); //random speed to the left 
      x=x-rand; 
      } 
      }); 
     timer.start(); 
     } 
    } 

    } 
+0

https://docs.oracle.com/javase/7/docs/api/java/util/Timer.html#cancel()? – bdares

+0

'while (x> 0) {' Какова цель цикла while? Он не будет прерван до тех пор, пока x <= 0, что не произойдет, потому что таймеры, которые уменьшают 'x', не смогут этого сделать (поскольку EDT уже занят) – copeg

ответ

1

наружныйActionListener реализация продолжается в то время как для цикла x для уменьшения до определенного значения (например, while (x>0)). Это происходит на EDT. Единственный код, который, кажется, уменьшает x находится в Timer с сгенерированным, но Timer запускает свой код на EDT, поэтому он должен ждать завершения, так x никогда не уменьшается. Другими словами, с предоставленной информацией наводит на мысль, что размещенный код блокирует EDT.

Непонятно, что вы после этого, но подумайте о создании единственного таймера, который уменьшает X и останавливается при выполнении условия. Например:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    x=365; //horizontal position 
    y=(int) (Math.random() * 365); // random vertical position 
    final Timer timer=new Timer(50,new ActionListener() { 

     public void actionPerformed(ActionEvent ae) { 
      jLabel1.setLocation(x,y); 
      rand=(int)(Math.random()*10); //random speed to the left 
      x=x-rand; 
      if (x <= 0){ 
       timer.stop(); 
      } 
     } 
    }); 
    timer.start(); 
} 
Смежные вопросы