import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;
import java.io.*;

public class Panel7 extends JPanel implements ActionListener, ChangeListener {
    
    protected static final int DEFAULT_FPS = 10;
    BufferedImage[] dukeWaving;
    javax.swing.Timer ticker;
    int width, height;
    long time, ticks, refreshes;
    
    public Panel7(int rate) {
	int delay = 1000/rate;
	String fs = File.separator;
	dukeWaving = new BufferedImage[10];
	
	// Set up the 10 frame images.
	for (int i=0; i<10; i++) {
	    ImageIcon nextII = new ImageIcon("images" + fs + "T" + (i+1) + ".gif");
	    Image nextImage = nextII.getImage();
	    dukeWaving[i] = new BufferedImage(nextImage.getWidth(this),nextImage.getHeight(this),BufferedImage.TYPE_4BYTE_ABGR);
	    dukeWaving[i].getGraphics().drawImage(nextImage,0,0,this);
	}
	
	ticker = new javax.swing.Timer(delay, this);
	ticker.start();
	width = dukeWaving[0].getWidth(this);
	height = dukeWaving[0].getHeight(this);
	setPreferredSize(new Dimension(width,height));
	time = System.currentTimeMillis();
	refreshes = 0;
	ticks = 0;
    }
    
    public void paintComponent(Graphics g) {
	refreshes++;
	if (refreshes == 100*(refreshes/100)) {
	    long newtime = System.currentTimeMillis();
	    System.out.println("Time elapsed:" + (newtime-time) + "  Ticks: " + ticks + "  Refreshes: " + refreshes + "  FPS: " + ((double)refreshes*1000/(newtime-time)));
	    ticks = 0;
	    refreshes = 0;
	    time = System.currentTimeMillis();
	}
	((Graphics2D)g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.5f));
	g.setColor(Color.white);
	g.fillRect(0,0,width,height);
	g.drawImage(dukeWaving[(int)refreshes%10],0,0,this);
    }
    
    public void actionPerformed(ActionEvent e) {
	ticks++;
	repaint();
	// System.out.println("Tick");
    }
        
    public void stateChanged(ChangeEvent e) {
	JSlider source = (JSlider)e.getSource();
	if (!source.getValueIsAdjusting()) {
	    int fps = (int)source.getValue();
	    System.out.println("New rate: " + fps + " frames/second");
	    int delay = 1000 / fps;
	    System.out.println("New delay: " + delay + " milliseconds");
	    ticker.setDelay(delay);
	}
    }

    public static void main(String[] args) {
	JFrame f = new JFrame("Panel7 animation demo");
	f.getContentPane().setLayout(new BorderLayout());
	Panel7 p = new Panel7(DEFAULT_FPS);
	f.getContentPane().add(p,BorderLayout.CENTER);
	JPanel p2 = new JPanel();
	f.getContentPane().add(p2,BorderLayout.SOUTH);
	JSlider fpsSlider = new JSlider(JSlider.HORIZONTAL,0,100,DEFAULT_FPS);
	fpsSlider.setMajorTickSpacing(10);
	fpsSlider.setPaintTicks(true);
	fpsSlider.setPaintLabels(true);
	fpsSlider.addChangeListener(p);
	p2.add(fpsSlider);
	f.pack();
	f.setVisible(true);
	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

