import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.io.IOException;
 
import javax.imageio.ImageIO;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.ImageIcon;
 
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
 
class SpriteSheetManager {
 
	private int sprite_width;
	private int sprite_height;
	private int spritesheet_width;
	private int spritesheet_height;
        private int x = 0;
        private int y = 0;
        private int maxNum = 0;
        private long runningTime = 0; 
 
	public SpriteSheetManager() {
		spriteSheet = null;
	}
 
	public SpriteSheetManager
(String file
) { 		setSpriteSheet(file);
	}
 
	public void setSpriteSheet
(String file
){ 		try {
			spriteSheet 
= ImageIO.
read(new File("images/"+file
)); //ImageIO.read(new URL("http://s...content-available-to-author-only...g.org/vso6oed91/spritesheet.png"));			e.printStackTrace();
		}
	}
 
	public void setSpriteSheetDimensions(int w, int h){
		spritesheet_width = w;
		spritesheet_height = h;
	}
 
	public void setSpriteDimensions(int w, int h){
		sprite_width = w;
		sprite_height = h;
	}
 
        public void setNumberOfSprites(){
            maxNum+= (spritesheet_height/sprite_height) * (spritesheet_width/sprite_width);
        }
 
		return spriteSheet;
	}
 
	public Image getSprite
(int num
){             if( (x*sprite_width) > (spritesheet_width - sprite_width) ){
                x = 0; y++;
                System.
out.
println("x = "+x
+" y = "+y
);             }
            if(num%maxNum == 0 && num != 0){x=0; y=0;}
            sprite = spriteSheet.getSubimage(x*sprite_width, y*sprite_height, sprite_width, sprite_height);
            x++;
            return sprite;
	}
}
 
class Ideone {
 
	public static void main
(String[] args
) { 			public void run() {
				new TestSpriteSheet();				
			}			
		});			
	}
 
}
 
class TestSpriteSheet 
extends JFrame{  
    private static final long serialVersionUID = 1L;
    private SpriteSheetManager ss;
    private long runningTime = 0;
 
    public TestSpriteSheet(){
	super("Testing SpriteSheets");
	setSize(200,200);
	setDefaultCloseOperation
(JFrame.
EXIT_ON_CLOSE);	setResizable(false);
            }
        });    
 
	ss = new SpriteSheetManager("spritesheet.png");
	ss.setSpriteSheetDimensions(321,381);
	ss.setSpriteDimensions(107,127);
 
        add(new PanelSprite(this, ss));
	this.setVisible(true);
    }
}
 
class PanelSprite 
extends JPanel{  
    private long runningTime = 0;
    private int fps = 24;
    private boolean stop = false;
    private SpriteSheetManager ss;
    private TestSpriteSheet temp;
    private int num = 0;
 
    public PanelSprite(TestSpriteSheet test, SpriteSheetManager sm){
        ss = sm;
        temp = test;
        setSize(180,180);
        init();
    }
 
        super.paintComponent(g);
        long time = 50000; 
        animate_with_gfx(g, time);
        if(runningTime <= time){
            num++;
        }
    }
 
    public void init(){
                if(!stop) {
                    repaint();
                } else {
                    ((Timer)e.
getSource()).
stop();                 }
            }
        });
        t.setRepeats(true);
        t.setDelay((int)(1000/fps));
        t.start();
    }
 
    public void animate_with_gfx
(Graphics g, 
long time
){         if(runningTime <= time){
            try {
                //System.out.println(runningTime); //Checking if this part works
                g.drawImage(ss.getSprite(num), 40, 40, null);
                runningTime+=(1000/fps);
                ex.printStackTrace();
            }
        }
        else{
            stop = true;
        }
    }
}