Я пытаюсь создать анимацию, импортируя изображения с листа спрайта и изменяя скорость с помощью таймера. Когда я устанавливаю скорость в первый раз, он работает отлично, но в любое время после этого он не изменит скорость. Предыдущая скорость продолжит воспроизведение, и я получу эту ошибку на выходе: 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);
}
}
}
}
В первую рекомендацию используйте таймер Swing 'Timer' вместо' TimerTask', помимо автономности и поддержки таких вещей, как 'stop',' start' и 'restart', также безопасно использовать для обновления пользовательского интерфейса в Swing - Swing не является потокобезопасным – MadProgrammer
Ударьте меня на удар - используйте 'javax.swing.Timer' не' java.util.Timer'. –
Я не согласен с MadProgrammer. Таймеры качания могут действительно подхватывать EDT, и это не * * * трудно закодировать, чтобы избежать ошибок параллелизма от всплытия. Эффективность будет иметь значительный успех с помощью Swing Timers. Но это одна из тех ситуаций, которые не согласны с ситуацией. В настоящее время я предпочитаю использовать JavaFX AnimationTimer. –