Hi there. I'm somewhat new to Java. I've used it before in the past, but I'm not that experienced. Anyway, I'm working on an open source MMORPG project and I'm attempting to get it to load animated GIF files.

Currently, it's set to load .png files as the sprites. I'm aware that Slick does not support animated gif's. So my question is, how can I get my sprite loader to display the animated GIF's moving at natural speed?

Here's my code:

Java Code:
package org.mmo.client.backend.entity;

import java.io.InputStream;

import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.loading.LoadingList;
import org.mmo.client.backend.FileLoader;

public class Monster {
        static final long serialVersionUID = 1;
       
        //load sprite and icon
        private Image m_sprite;
        private Image m_icon;
        private int m_spriteNum;
       
        //load trainer data
        private int m_trainerID;
       
        // 0 or 1
        private int m_gender;
        //name and species data
        private String m_name;
        private String m_nick;
        private Enums.Monsternum m_species;
        private boolean m_shiny;
       
        //level and types
        private int m_level;
        private Enums.Monstertype m_type1, m_type2;
       
        //moves and pp
        private String[] m_moves = new String[4];
        private int[] m_movemaxPP = new int[4];
        private int[] m_movecurPP = new int[4];
       
        //stats
        private int m_maxHP, m_curHP;
       
        /**
         * Returns the sprite
         * @return
         */
        public Image getSprite() {
                return m_sprite;
        }
        
        /**
         * Loads the sprite
         */
        private void setSprite() {
        	String respath = System.getProperty("res.path");
			if(respath==null)
				respath="";
    		LoadingList.setDeferredLoading(true);
        	try{
        		InputStream f;
        		String path = new String();
        		String index, isShiny = new String();

        		if (!isShiny()){
        			isShiny = "normal/";
        		} else {
        			isShiny = "rare/";
        		}

        		if (m_spriteNum < 10) {
        			index = "00" + String.valueOf(m_spriteNum);
        		} else if (m_spriteNum < 100) {
        			index = "0" + String.valueOf(m_spriteNum);
        		} else {
        			if(getSpriteNumber() > 389)
    					index = String.valueOf(getSpriteNumber() - 3);
    				else
    					index = String.valueOf(getSpriteNumber());
        		}
        		
        		int pathGender;
        		if (getGender() != 2)
        			pathGender = 3;
        		else
        			pathGender = 2;

        		try {
        			path = respath+"res/sprite/front/" + isShiny + index + "-"
        				+ pathGender + ".png";
        			f = FileLoader.loadFile(path);
        			m_sprite = new Image(f, path.toString(), false);
        		} catch (Exception e) {
        			if(pathGender == 3)
        				pathGender = 2;
        			else
        				pathGender = 3;
        			path = respath+"res/sprite/front/" + isShiny + index + "-"
        				+ pathGender + ".png";
        			m_sprite = new Image(path.toString(), false);
        			e.printStackTrace();
        		}
        		LoadingList.setDeferredLoading(false);
        	}catch (SlickException e){e.printStackTrace();}
        }

        /**
         * Returns the icon
         * @return
         */
        public Image getIcon() {
                return m_icon;
        }
        
        /**
         * Loads the icon
         */
        private void setIcon() {
        	String respath = System.getProperty("res.path");
			if(respath==null)
				respath="";
                try{
                		LoadingList.setDeferredLoading(true);
                        String path = new String();
                        String index = new String();
                       
                        if (m_spriteNum < 10) {
                                index = "00" + String.valueOf(m_spriteNum);
                        }
                        else if (m_spriteNum < 100){
                                index = "0" + String.valueOf(m_spriteNum);
                        }
                        else{
                        	if(getSpriteNumber() > 389)
            					index = String.valueOf(getSpriteNumber() - 3);
            				else
            					index = String.valueOf(getSpriteNumber());
                        }
                       
                        path = respath+"res/sprite/icons/" + index + ".gif";
                        m_icon = new Image(path, false);
                        LoadingList.setDeferredLoading(false);
                }catch (SlickException e){e.printStackTrace();}
        }      
        
        /**
         * Returns trainer ID
         * @return
         */
        public int getTrainerID() {
                return m_trainerID;
        }
        
        /**
         * Sets Trainer ID
         * @param trainerID
         */
        public void setTrainerID(int trainerID) {
                this.m_trainerID = trainerID;
        }
        
        /**
         * Returns gender
         * @return
         */
        public int getGender() {
                return m_gender;
        }
        
        /**
         * Sets gender
         * @param gender
         */
        public void setGender(int gender) {
                this.m_gender = gender;
        }
        
        /**
         * Returns name
         * @return
         */
        public String getName() {
                return m_name;
        }
        
        /**
         * Sets name
         * @param name
         */
        public void setName(String name) {
        		this.m_name = name;
        }
        
        /**
         * Returns nickname
         * @return
         */
        public String getNick() {
                return m_nick;
        }
        
        /**
         * Sets nickname
         */
        public void setNick(String nick) {
                this.m_nick = nick;
        }
        
        /**
         * Returns species
         * @return
         */
        public Enums.Monsternum getSpecies() {
                return m_species;
        }
        
        /**
         * Sets species
         * @param species
         */
        public void setSpecies(Enums.Monsternum species) {
                this.m_species = species;
        }
        
        /**
         * Returns whether or not a monster is shiny
         * @return
         */
        public boolean isShiny() {
                return m_shiny;
        }
        
        /**
         * Sets whether a monster appears shiny
         * @param shiny
         */
        public void setShiny(boolean shiny) {
                this.m_shiny = shiny;
        }
        
        /**
         * Returns level
         * @return
         */
        public int getLevel() {
                return m_level;
        }
        
        /**
         * Sets level
         * @param level
         */
        public void setLevel(int level) {
                this.m_level = level;
        }
        
        /**
         * Returns type 1
         * @return
         */
        public Enums.Monstertype getType1() {
                return m_type1;
        }
        
        /**
         * Sets type 1
         * @param type1
         */
        public void setType1(Enums.Monstertype type1) {
                this.m_type1 = type1;
        }
        
        /**
         * Returns type 2
         * @return
         */
        public Enums.Monstertype getType2() {
                return m_type2;
        }
        
        /**
         * Sets type 2
         * @param type2
         */
        public void setType2(Enums.Monstertype type2) {
                this.m_type2 = type2;
        }
        
        /**
         * Returns moves
         * @return
         */
        public String[] getMoves() {
                return m_moves;
        }
        
        /**
         * Sets moves
         * @param moves
         */
        public void setMoves(String[] moves) {
        	this.m_moves = moves;
        }
        
        /**
         * Sets a specific move
         * @param index
         * @param move
         */
        public void setMoves(int index, String move) {
        	this.m_moves[index] = move;
        }
        
        /**
         * Returns maximum PP for moves
         * @return
         */
        public int[] getMoveMaxPP() {
                return m_movemaxPP;
        }
        
        /**
         * Sets maximum PP for moves
         * @param movemaxPP
         */
        public void setMoveMaxPP(int[] movemaxPP) {
                this.m_movemaxPP = movemaxPP;
        }
        
        /**
         * Sets maximum PP of a move
         * @param move
         * @param pp
         */
        public void setMoveMaxPP(int move, int pp) {
        	m_movemaxPP[move] = pp;
        }
        
        /**
         * Returns current PP for moves
         * @return
         */
        public int[] getMoveCurPP() {
                return m_movecurPP;
        }
        
        /**
         * Sets current PP for moves
         * @param movecurPP
         */
        public void setMoveCurPP(int[] movecurPP) {
                this.m_movecurPP = movecurPP;
        }
        
        /**
         * Sets current PP for a specified move
         * @param move
         * @param pp
         */
        public void setMoveCurPP(int move, int pp) {
                this.m_movecurPP[move] = pp;
        }
        
        /**
         * Returns max HP
         * @return
         */
        public int getMaxHP() {
                return m_maxHP;
        }
        
        /**
         * Sets max HP
         * @param maxHP
         */
        public void setMaxHP(int maxHP) {
                this.m_maxHP = maxHP;
        }
        
        /**
         * Returns current HP
         * @return
         */
        public int getCurHP() {
                return m_curHP;
        }
        
        /**
         * Set current HP
         * @param curHP
         */
        public void setCurHP(int curHP) {
                this.m_curHP = curHP;
        }
        
        /**
         * Sets sprite number and loads sprites
         * @param x
         * @return
         */
        public void setSpriteNumber(int x) {
        	m_spriteNum = x;
        	try{
        		setSprite();
        	} catch (Exception e){
        		setSprite();
        	}
        	try{
        		setIcon();
        	} catch (Exception e){
        		setIcon();
        	}
        }
        
        /**
         * Returns the sprite number
         * @return
         */
        public int getSpriteNumber(){
        	return m_spriteNum;
        }
        
        /**
         * Ststic method to get the file path for a monster's icon by it's index number
         * @param i
         * @return
         */
        public static String getIconPathByIndex(int i){
        	String path = new String();
        	String index = new String();
        	String respath = System.getProperty("res.path");
			if(respath==null)
				respath="";
			
        	if (i < 10) {
        		index = "00" + String.valueOf(i);
        	} else if (i < 100){
        		index = "0" + String.valueOf(i);
        	} else {
        		index = String.valueOf(i);
        	}
               
                path = respath+"res/sprite/icons/" + index + ".gif";
                return path;
        }
}