2017-02-23 15 views
0

Я пытаюсь создать анимацию, импортируя изображения с листа спрайта и изменяя скорость с помощью таймера. Когда я устанавливаю скорость в первый раз, он работает отлично, но в любое время после этого он не изменит скорость. Предыдущая скорость продолжит воспроизведение, и я получу эту ошибку на выходе: http://imgur.com/a/sWhmQТребуется помощь при остановке таймера при изменении ползунка

Любая помощь будет оценена.
Вот то, что я до сих пор:

Редактировать: Найден проблема для TimerTask & переместил его в ChangeListener, однако, скорость по-прежнему не меняется, когда ползунок перемещается.

import javax.swing.*; 
import javax.swing.event.*; 
import java.awt.event.*; 
import java.util.Timer; 
import java.util.TimerTask; 

public class AnimationGUI { 

    private static int counter = 0; 
    private static JLabel value = new JLabel("0"); 
    private static JLabel image = new JLabel(""); 
    private static Timer timer = new Timer(); 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Animation GUI"); 
     JPanel panel = new JPanel(); 
     JSlider slider = new JSlider(JSlider.HORIZONTAL, 1, 10, 1); 

     slider.addChangeListener(new Slider()); 

     frame.setVisible(true); 
     frame.setSize(500, 500); 
     frame.setResizable(false); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setContentPane(panel); 

     panel.add(slider); 
     panel.add(value); 
     panel.add(image); 
    } 

    private static class Slider implements ChangeListener { 

     public void stateChanged(ChangeEvent event) { 
      JSlider source = (JSlider) event.getSource(); 

      TimerTask task = new TimerTask() { 
       public void run() { 
        image.setIcon(new ImageIcon(counter + ".png")); 
        counter++; 
        if (counter > 12) { 
         counter = 0; 
        } 
       } 
      }; 

      if (!source.getValueIsAdjusting()) { 
       value.setText("" + (int) source.getValue()); 
       int speed = source.getValue() * 100; 
       timer.scheduleAtFixedRate(task, 0, speed); 
      } 
     } 
    } 
} 
+2

В первую рекомендацию используйте таймер Swing 'Timer' вместо' TimerTask', помимо автономности и поддержки таких вещей, как 'stop',' start' и 'restart', также безопасно использовать для обновления пользовательского интерфейса в Swing - Swing не является потокобезопасным – MadProgrammer

+1

Ударьте меня на удар - используйте 'javax.swing.Timer' не' java.util.Timer'. –

+0

Я не согласен с MadProgrammer. Таймеры качания могут действительно подхватывать EDT, и это не * * * трудно закодировать, чтобы избежать ошибок параллелизма от всплытия. Эффективность будет иметь значительный успех с помощью Swing Timers. Но это одна из тех ситуаций, которые не согласны с ситуацией. В настоящее время я предпочитаю использовать JavaFX AnimationTimer. –

ответ

0

Я подозреваю, что вам необходимо отменить существующую TimerTask и запустить новую с требуемой скоростью.

2

Первая рекомендация использовать свинг Timer вместо TimerTask, кроме были самодостаточными и поддерживающих такие вещи, как stop, start и restart, это также безопасно использовать для обновления пользовательского интерфейса от - свинг не Потокобезопасная

Что-то вроде ...

private static class Slider implements ChangeListener { 

    private Timer timer; 

    public Slider() { 
     timer = new Timer(16, new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
       image.setIcon(new ImageIcon(counter + ".png")); 
       counter++; 
       if (counter > 12) { 
        counter = 0; 
       }      
      } 
     }); 
     timer.start() 
    } 

    public void stateChanged(ChangeEvent event) { 
     JSlider source = (JSlider) event.getSource(); 
     if (!source.getValueIsAdjusting()) { 
      value.setText("" + (int) source.getValue()); 
      int speed = source.getValue() * 100; 
      timer.setDelay(speed); 
     } 
    } 
} 

в качестве примера

См How to use Timers для более подробной информации

Смежные вопросы