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);
}
格式化
廣告
文章分類
廣告2
2012年12月15日 星期六
[JAVA教學範例] 利用雙重緩衝解決AWTt的Canvas閃爍問題
訂閱:
張貼留言
(
Atom
)
![[JAVA教學範例] 利用雙重緩衝解決AWTt的Canvas閃爍問題 [JAVA教學範例] 利用雙重緩衝解決AWTt的Canvas閃爍問題](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFZzckx9D_8AJunOfkkQK_vn2anz7J_qm9x9pOEkrbmokM9Zx6QK8YxrOfX8EjMZ6wzuY_7wzIQ2R5x5s77ToFvaYgDc1QMEj8P-aIJyq-KkSHG1edUuaPI_PJ1fe-Ox4fEdV62234gNo/s640/java_logo.png)
沒有留言 :
張貼留言