import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; import java.util.Hashtable; public class SliderDemo2 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 SliderDemo2(String windowTitle) { super(windowTitle); delay = 1000 / FPS_INIT; //Create the slider. JSlider framesPerSecond = new JSlider(JSlider.VERTICAL, 0, 30, FPS_INIT); framesPerSecond.addChangeListener(new SliderListener()); framesPerSecond.setMajorTickSpacing(10); framesPerSecond.setPaintTicks(true); //Create the label table. Hashtable labelTable = new Hashtable(); //PENDING: could use images, but we don't have any good ones. labelTable.put(new Integer( 0 ), new JLabel("Stop") ); //new JLabel(new ImageIcon("images/stop.gif")) ); labelTable.put(new Integer( 3 ), new JLabel("Slow") ); //new JLabel(new ImageIcon("images/slow.gif")) ); labelTable.put(new Integer( 30 ), new JLabel("Fast") ); //new JLabel(new ImageIcon("images/fast.gif")) ); framesPerSecond.setLabelTable(labelTable); framesPerSecond.setPaintLabels(true); framesPerSecond.setBorder( BorderFactory.createEmptyBorder(0,0,0,10)); //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 BorderLayout()); contentPane.add(framesPerSecond, BorderLayout.WEST); contentPane.add(picture, BorderLayout.CENTER); 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) { SliderDemo2 animator = new SliderDemo2("SliderDemo2"); animator.pack(); animator.setVisible(true); animator.startAnimation(); } }