Я пытаюсь создать анимацию, импортируя изображения из листа спрайтов и изменяя скорость с помощью таймера. Когда я устанавливаю скорость в первый раз, она работает отлично, но в любое время после этого она не изменит скорость. Воспроизведение продолжится с предыдущей скоростью, и я получаю эту ошибку на выходе: https://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);
}
}
}
}
Timer
вместоTimerTask
, помимо того, что он автономен и поддерживает такие вещи, какstop
,start
иrestart
, его также безопасно использовать для обновления пользовательского интерфейса в Swing - Swing не является потокобезопасным - person MadProgrammer   schedule 23.02.2017javax.swing.Timer
, а неjava.util.Timer
. - person Hovercraft Full Of Eels   schedule 23.02.2017SwingUtiltities.invokeLater
,synchronized
также засорили бы EDT, но вы правы, это не ВСЕГДА лучшее решение, но в этом случае я бы сказал, что это самое простое - в какой-то момент вам придется получить данные из того, какой другой поток использовался для EDT, таким образом, чтобы не нарушать однопоточный характер API - мне бы очень хотелось посмотреть, как вы примените JavaFXAnimationTimer
к Swing, в качестве сравнения - person MadProgrammer   schedule 23.02.2017Timer
(иSwingWorker
) используютSwingUtilities.invokeLater
для планирования обновлений, поэтому, если вы не нарушаете однопоточный характер API, как еще вы безопасно обновляете свойства пользовательского интерфейса? JavaFX работает так же (насколько я понимаю) - возможно, просто более эффективно, учитывая, что он будет генерировать исключения, если вы попытаетесь обновить пользовательский интерфейс вне контекста, это поток событий. - person MadProgrammer   schedule 23.02.2017