animation1.java

来自「java的书上例子」· Java 代码 · 共 134 行

JAVA
134
字号
import java.awt.*;
import java.applet.*;
import java.awt.image.*;
import java.awt.event.*;
import java.net.*;

/** 一个显示动画的Applet小应用程序,考虑了消除闪烁、双缓冲、跟踪图象的载入等技术 
  * @作者:尉哲明
  * @日期:2001年5月 */

/** 定义Applet类 */
public class Animation1 extends Applet implements Runnable
{
	private Thread runner;
	private Image image;
	private int imageWidth;
	private int imageHeight;
	private String imageName;
	private BufferedImage offImage;
	private Graphics2D offGraphics;
	private boolean flag;
	
	/** init()方法,用来下载动画文件并注册鼠标监听器,使用户可以控制动画的启停 */
	public void init()
	{
		addMouseListener(new MouseAdapter()
		{
			public void mousePressed(MouseEvent ev)
			{
				if(runner==null)
					start();
				else
					stop();
			}
		});
		
		try
		{
			imageName=getParameter("imagename");
			if (imageName==null) imageName="";
		}
		catch(Exception e)	
		{
			showStatus("Error: "+e);
		}
		image=null;
		loadImage();
	}//init()方法结束
	
	/** 该方法用来下载动画文件 */
	public void loadImage()
	{
		try
		{
			URL url=new URL(getDocumentBase(),imageName);
			image=getImage(url);
			MediaTracker tracker=new MediaTracker(this);
			tracker.addImage(image,0);
			tracker.waitForID(0);
			imageWidth=image.getWidth(null);
			imageHeight=image.getHeight(null);
			resize(imageWidth,imageHeight);
		}
		catch(InterruptedException e)
		{
			showStatus("Loading interrupted");
		}
		catch(MalformedURLException e)
		{
			showStatus("Bad URL");
		}
	}//loadImage()方法结束
	
	/** Applet的start()方法 */
	public void start()
	{
		flag=true;
		runner=new Thread(this);
		runner.start();
		showStatus("click to stop");
	}
	
	/** Applet的stop()方法 */
	public void stop()
	{
		flag=false;
		runner.interrupt();
		runner=null;
		showStatus("click to restart");
	}
	
	/** Applet的paint()方法 */
	public void paint(Graphics g)
	{
		if(image==null) return;
		g.drawImage(image,0,0,null);
	}
	
	/** Applet的update()方法,该方法不清除屏幕,并采用双缓冲技术生成一幅后台图像,
	  * 然后把后台图像一次显示于屏幕 */
	public void update(Graphics g)
	{
		Dimension d=getSize();
		
		
		if (offGraphics==null)
		{
			offImage = new BufferedImage(image.getWidth(null),image.getHeight(null), BufferedImage.TYPE_INT_RGB);
      		offGraphics = offImage.createGraphics();
      	}
		
		offGraphics.drawImage(image, 0, 0, null);
		
		g.drawImage(offImage,0,0,this);
	}
	
	/** 在线程中显示动画 */	
	public void run()
	{
		long startTime=System.currentTimeMillis();
		while (flag)
		{
			repaint();
			try
			{
				startTime+=200;
				Thread.sleep(Math.max(0,startTime-System.currentTimeMillis()));
			}
			catch(InterruptedException e)
			{}
		}
	}//run()方法结束
}//Animation1类结束

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?