import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class SliderDemo extends JFrame implements ActionListener { //Set up animation parameters. static final int FPS_INIT = 15; //initial frames per second int frameNumber = 0; int delay; Timer timer; boolean frozen = false; //This label uses ImageIcon to show the doggy pictures. JLabel picture; public SliderDemo(String windowTitle) { super(windowTitle); delay = 1000 / FPS_INIT; //Create the slider and its label JLabel sliderLabel = new JLabel("Frames Per Second", JLabel.CENTER); sliderLabel.setAlignmentX(Component.CENTER_ALIGNMENT); JSlider framesPerSecond = new JSlider(JSlider.HORIZONTAL, 0, 30, FPS_INIT); framesPerSecond.addChangeListener(new SliderListener()); //Turn on labels at major tick marks. framesPerSecond.setMajorTickSpacing(10); framesPerSecond.setMinorTickSpacing(1); framesPerSecond.setPaintTicks(true); framesPerSecond.setPaintLabels(true); framesPerSecond.setBorder( BorderFactory.createEmptyBorder(0,0,10,0)); //Create the label for the animation. picture = new JLabel(new ImageIcon("images/doggy/T" + frameNumber + ".gif"), JLabel.CENTER); picture.setAlignmentX(Component.CENTER_ALIGNMENT); picture.setBorder(BorderFactory.createCompoundBorder( BorderFactory.createLoweredBevelBorder(), BorderFactory.createEmptyBorder(10,10,10,10))); //Put everything in the content pane. JPanel contentPane = new JPanel(); contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS)); contentPane.add(sliderLabel); contentPane.add(framesPerSecond); contentPane.add(picture); contentPane.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); setContentPane(contentPane); //Set up a timer that calls this object's action handler. timer = new Timer(delay, this); timer.setInitialDelay(delay * 10); //pauses animation after frames //0 and 6 by restarting the timer timer.setCoalesce(true); //Add a listener for window events addWindowListener(new WindowAdapter() { public void windowIconified(WindowEvent e) { stopAnimation(); } public void windowDeiconified(WindowEvent e) { startAnimation(); } public void windowClosing(WindowEvent e) { System.exit(0); } }); } /** Listens to the slider. */ class SliderListener implements ChangeListener { public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if (!source.getValueIsAdjusting()) { int fps = (int)source.getValue(); if (fps == 0) { if (!frozen) stopAnimation(); } else { delay = 1000 / fps; timer.setDelay(delay); timer.setInitialDelay(delay * 10); if (frozen) startAnimation(); } } } } public void startAnimation() { //Start (or restart) animating! timer.start(); frozen = false; } public void stopAnimation() { //Stop the animating thread. timer.stop(); frozen = true; } //Called when the Timer fires public void actionPerformed(ActionEvent e) { //Advance the animation frame. if (frameNumber==13) { frameNumber = 0; } else { frameNumber++; } //XXX no caching? picture.setIcon(new ImageIcon("images/doggy/T" + frameNumber + ".gif")); if (frameNumber==0 || frameNumber==6) { timer.restart(); } } public static void main(String[] args) { SliderDemo animator = new SliderDemo("SliderDemo"); animator.pack(); animator.setVisible(true); animator.startAnimation(); } }