2016-03-01 4 views
0

Я хочу выполнить анимацию в апплете каждый раз, когда я нажимаю кнопку. В первый раз, когда я нажимаю кнопку, все работает нормально. Но во второй раз скорость анимации возрастает. В третий раз скорость анимации увеличивается немного больше, а четвертая и пятая, ...Таймер увеличивается скорость каждый раз, когда я нажимаю кнопку

Я не знаю, что происходит с таймером. Как я могу это исправить?

В апплета я использую этот код:

JButton btnIniciar = new JButton("Iniciar"); 
    btnIniciar.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) {  
      Timer timer = new Timer(50, new ActionListener(){ 
       public void actionPerformed(ActionEvent e) { 
        //I have a list of packages to animate 
        for (Package p: listaPaquetes){ 
         p.animate(); 
         panel.repaint(); 
        }        
       } 
      }); 

      timer.start(); 
     } 

И это код перекрашивать в панели:

protected void paintComponent(Graphics g) { 
    super.paintComponent(g);  
    //I use the same list of the applet 
    for (Package p: listaPaquetes){ 
     //Paint the package 
     p.paintPackage(g); 
    } 

} 

This is how it works, the animation sends packages from left to right

ответ

2

При нажатии на кнопку, вы создаете новый javax.swing.Timer и вызывая timer.start(), который в этом случае должен запустить 50 мс после нажатия кнопки и повторения каждые 50 мс.

При повторном нажатии кнопки вы создаете и запускаете еще один таймер (новый), который снова работает каждые 50 мс с начальной задержкой 50 мс. Теперь вы по существу удваиваете количество вызовов перерисовки.

С третьим нажатием кнопки вы увеличиваете количество вызовов перерисовки, поскольку у вас есть 3 таймера.

Если ваши нажатия на кнопки были установлены правильно, это будет выглядеть так, как если бы скорость была втрое (при нажатии на 3 кнопки).

Если вы не хотите этого поведения, вы можете предотвратить timer бежать, если он уже запущен, как это:

private Timer timer = null; 

// ... 

JButton btnIniciar = new JButton("Iniciar"); 
btnIniciar.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     // prevent the timer from running again if it is already running 
     if (timer != null && timer.isRunning()) return; 

     timer = new Timer(50, new ActionListener(){ 
      public void actionPerformed(ActionEvent e) { 
       //I have a list of packages to animate 
       for (Package p: listaPaquetes){ 
        p.animate(); 
        panel.repaint(); 
       }        
      } 
     }); 

     timer.start(); 
    } 

Пожалуйста, обратите внимание, что вам нужно сделать timer в переменную экземпляра. Кроме того, вы можете заменить строку:

if (timer != null && timer.isRunning()) return; 

с

if (timer != null) return; 

Я просто хотел показать вам, что Timer имеет isRunning() метод.

Вы также можете остановить timer, вызвав метод timer.stop().

+0

Решено. Я не знал, где положить таймер, поэтому каждый раз, когда я нажимаю кнопку, я также останавливаю таймер, кроме первого раза. – carlbron