当滑块发生变化时,需要有关停止计时器的帮助

时间:2017-02-23 01:27:21

标签: java swing timer timertask changelistener

我正在尝试通过从精灵表导入图片并使用计时器更改速度来创建动画。当我第一次设置速度时,它可以很好地工作,但在此之后的任何时候它都不会改变速度。之前的速度将继续播放,我在输出中收到此错误:http://imgur.com/a/sWhmQ

任何帮助将不胜感激 以下是我到目前为止的情况:

编辑:发现timerTask&的问题但是,当滑块移动时,速度仍然没有改变。

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 个答案:

答案 0 :(得分:2)

首先推荐使用Swing Timer而不是TimerTask,除了自包含和支持stopstartrestart之类的内容之外,它也可以安全地用于更新UI - Swing不是线程安全的

像...一样的东西。

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

答案 1 :(得分:0)

我怀疑您需要取消现有的TimerTask并以所需的速度启动一个新的。