格式化

廣告

廣告2

2012年12月15日 星期六

[JAVA教學範例] 利用雙重緩衝解決AWTt的Canvas閃爍問題

[JAVA教學範例] 利用雙重緩衝解決AWTt的Canvas閃爍問題
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;

/**
 * 因為awt原本的update方法會"一直自動"清同一張畫布而造成畫面閃爍,所以改成用兩張畫布雙重緩衝方式來繪圖。
 * 在awt中對於視窗畫布的重繪其順序是repaint()—>update()—>paint();
 * 現在我們明白了,螢幕上之所以出現閃爍是因為在update()方法內先要嘩嘩的清空屏幕上原有的東西,
 * 然後又嘩嘩的往上畫,所以在我們需要不斷重繪的屏幕上出現閃爍是必然的了, 哪怕CPU的速度快之又快。
 * 
 * @param MyCanvas
 */
public abstract class MyCanvas extends Canvas implements Runnable {

 private static final long serialVersionUID = 1L;
 /**
  * 第二張畫布(即後景)
  * 
  * @param secordImage
  */
 private Image secordImage;
 private Graphics secordCanvas;

 public MyCanvas() {
  new Thread(this).start();
 }

 public void run() {
  while (true) {
   try {
    repaint();
    Thread.sleep(20);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
  }
 }

 /**
  * 覆寫Canvas類別中的update,使的awt不會一直去clear螢幕
  * 
  * @param g
  */
 public void update(Graphics g) {
  //截取視窗所在位置的圖片
  if (secordImage == null)
   secordImage = createImage(getWidth(), getHeight());
  //獲得截取圖片的畫布
  secordCanvas = secordImage.getGraphics();
  secordCanvas.setColor(Color.PINK);
  secordCanvas.fillRect(0, 0, getWidth(), getHeight());
  updates(secordCanvas);
  draw(secordCanvas);
  //將接下來的圖片加載到窗體畫布上去,才能考到每次畫的效果 
  g.drawImage(secordImage, 0, 0, null);
 }

 /**
  * 定義抽象方法"繪製"畫在眼睛前面的畫布(即前景)
  * 
  * @param g
  */
 public abstract void draw(Graphics g);

 /**
  * 定義抽象方法"更新"畫在眼睛前面的畫布(即前景)
  * 
  * @param g
  */
 public abstract void updates(Graphics g);

}

沒有留言 :