import java.applet.*;
import java.awt.*;

// Un poco radical, pero por el momento vale. ¡Todo para dentro!
//                    Heredando echaré de menos los :
//                    -------					 
public class Beltran1 extends Applet implements Runnable
{
	Thread	 m_Beltran1 = null;

	private Graphics m_Graphics;
	private Image	 m_Image;
	private Image	 m_Fondo;
	private int 	 m_nImgWidth  = 0;
	private int 	 m_nImgHeight = 0;
	private boolean  m_fAllLoaded = false;
	private int	     m_cordx = -400;	

	// Un constructor que no hace nada
	public Beltran1(){}

	// Esto es para saber quien ha hecho el applet osease yo
	// Y con qué, osease Visual J++ beta que me han mandado
	// muy amablemente los amigos de Microsoft. Thanks Dave
	
	public String getAppletInfo()
	{
		return "Name: Beltran1\r\n" +
		       "Author: Beltrán Rubio de Hita\r\n" +
		       "Created with Microsoft Visual J++ Version 1.0";
	}
	// Lo del inglés es una concesión (una más) al idioma imperial
	

	// Este es el metodo de inicio que se llama cuando se carga un applet por
	// primera vez o se recarga. Aquí se suelen incializar las estructuras de 
	// datos, se cargan las imágenes o los fonts, se crean las ventanas o se 
	// añaden UIs y seguro que se me ha olvidado algo
	public void init()
	{
        
		resize(300, 100);
		// Y esto es todo amigos... ¿qué se puede esperar de un applet
		// tan simplón?. Sólo define el tamaño del applet
	}

	
	public void destroy()
	{
		// Nada que destruir en Java no hay deletes, ¡ADIOS A LA TRISTEZA!
		// y no hay por lo pronto ninguno otra cosa que limpiar.
	}

	// El método imageUpdate es llamado repetidamente por AWT mientras que se 
	// construyen las imágenes. Los flags proporcionan información sobre el 
	// estado de las imágenes en construcción. Cuando ALLBITS está activado,
	// el método sabe cuando una imagen está completamente cargada. Cuando están
	// todas cargadas ponemos m_fAllLoaded a true y la animación puede comenzar

	public boolean imageUpdate(Image img, int flags, int x, int y, int w, int h)
	{
		// Si todas las imágenes están cargadas nos vamos con la música a otra parte
		//--------------------------------------------------------------------------
		if (m_fAllLoaded)
			return false;

		// Todos los bits tienen que estar cargados antes de empezar al dibujar
		//----------------------------------------------------------------------
		if ((flags & ALLBITS) == 0)
			m_fAllLoaded = true;
			return true;

	}

    
    //		Dibuja la siguiente imagen si todas las imágenes están cargadas
    //--------------------------------------------------------------------------
	private void displayImage(Graphics g)
	{
		if (!m_fAllLoaded)
			return;

		g.clearRect(0, 0, 300, 100);

		g.drawImage(m_Image, m_cordx, 0, null);
		
				   
	}

	// El manipuladeor de pintado de Beltran1
	//--------------------------------------------------------------------------
	public void paint(Graphics g)
	{
		setBackground(Color.white);

		// Esto es para poner un mensajito mientras se cargan las imágenes para
		// que el espectador no se aburra y diga: mira está pasando algo.
		//----------------------------------------------------------------------
		if (m_fAllLoaded)
		{
			displayImage(g);
		}
		else
			g.drawString("Espera mientras se cargan la imágen", 10, 20);
				
	}

	// start() es el método que se llama cuando la página se carga por primera
	// vez en la pantalla.
	//--------------------------------------------------------------------------
	public void start()
	{
		if (m_Beltran1 == null)
		{
			m_Beltran1 = new Thread(this);
			m_Beltran1.start();
		}
	
	}
	
	// El stop() es obvio
	//--------------------------------------------------------------------------
	public void stop()
	{
		if (m_Beltran1 != null)
		{
			m_Beltran1.stop();
			m_Beltran1 = null;
		}


	}

	// El método run() se llama cuando la tarea del applet comienza.
	// si tu applet realiza trabajos sin esperar que el usuario haga
	// algo, es el momento de hacerlo. En este caso de una animación
	// se controla la visualización de las imágenes
	
	public void run()
	{
		m_Graphics = getGraphics();
		
		// Carga todas las imágenes
		//----------------------------------------------------------------------
		m_Image = getImage(getDocumentBase(), "a10.gif");

		// Cogemos la anchura y la altura de una imagen asumiendo que todas
		// son iguales
		//------------------------------------------------------------------
		if (m_nImgWidth == 0)
		{
			try	// esto del try me encanta
			{
				
				while ((m_nImgWidth = m_Image.getWidth(null)) < 0)
					Thread.sleep(1);
							while ((m_nImgHeight = m_Image.getHeight(null)) < 0)
					Thread.sleep(1);						
			}
			catch (InterruptedException e)
			{
				// 
					//	Aquí la manipulación de excepciones, corramos un tupido velo
					//	por el momento
					//
				
			}

			// Con esto forzamos a que la imagen se carge del todo
			//------------------------------------------------------------------
			m_Graphics.drawImage(m_Image, -1000, -1000, this);
		}

		// Esperando a que se cargen todas las imágenes
		//----------------------------------------------------------------------
		while (!m_fAllLoaded)
		{
			try
			{
				Thread.sleep(10);
			}
			catch (InterruptedException e)
			{
			}
		}
		
		repaint();

		while (true)
		{
			try
			{
				displayImage(m_Graphics);
				m_cordx += 20;
				if (m_cordx == 420)
					m_cordx = -400;
								
				Thread.sleep(100);
			}
			catch (InterruptedException e)
			{
				stop();
			}
		}
	}

}

// y este es el esqueleto completo de esos divertidos applets

    Source: geocities.com/siliconvalley/9276

               ( geocities.com/siliconvalley)