分析前提出幾個問題
首先我們來解答第一個問題
我們在屏幕上自繪圖形或者是添加圖片都是要通過所在畫布的重繪來實現的
Java代碼
/**
* Updates the container
* components that are children of this container
* reimplemented
* components are properly rendered
* clipped by the current clipping setting in g
* forwarded to that child
*
* @param g the specified Graphics window
* @see
Component#update(Graphics)
*/
public void update(Graphics g) {
if (isShowing()) {
if (! (peer instanceof LightweightPeer)) {
g
}
paint(g);
}
}
從這裡我們可以清晰的看到
現在我們明白了
通過上述的分析
Java代碼
// 重寫update方法
public void update(Graphics g) {
if (offScreenImage == null) {
// 截取窗體所在位置的圖片
offScreenImage = this
}
// 獲得截取圖片的畫布
Graphics gImage = offScreenImage
// 獲取畫布的底色並且使用這種顏色填充畫布(默認的顏色為黑色)
Color c = Color
gImage
gImage
// 將截下的圖片上的畫布傳給重繪函數
paint(gImage);
//將接下來的圖片加載到窗體畫布上去
g
}
其實一言以蔽之就是通過重寫update()方法改變重繪函數paint(g)重繪的畫布對象g
以上的討論我們都是在awt中進行
(
Java代碼
// 重寫update方法
public void update(Graphics g) {
System
if (offScreenImage == null) {
// 截取窗體所在位置的圖片
看看結果
要是沒覺得意外的話就繼續往下看
在swing中測試update():
Java代碼
// 重寫update方法
public void update(Graphics g) {
System
if (offScreenImage == null) {
// 截取窗體所在位置的圖片
結果是
是不是有點吃驚了
那麼怎麼通過其他的方法消除swing中的閃爍問題呢
Java代碼
public void paint(Graphics g)
{
// 在重繪函數中實現雙緩沖機制
offScreenImage = this
// 獲得截取圖片的畫布
gImage = offScreenImage
// 獲取畫布的底色並且使用這種顏色填充畫布
gImage
gImage
// 調用父類的重繪方法
super
// 當游戲沒有結束的時候繪出對戰雙方
if (!getGameOver()) {
// 畫出自己的坦克
paintMyTank(gImage);
// 畫出自己坦克發射的子彈
paintMyBullet(gImage);
// 畫出敵方坦克
paintEnemyTank(gImage);
// 畫出敵方坦克發射的子彈
paintEnemyBullet(gImage);
}
// 畫出草地
paintGrass(gImage);
// 畫出小河
paintRiver(gImage);
// 畫出石頭
paintStone(gImage);
// 畫出各種道具
paintTool(gImage);
// 將接下來的圖片加載到窗體畫布上去
g
}
有一些相似的部分吧
下面我們再探討最後一個問題
Java代碼
/**
* Just calls paint(g)
* prevent an unnecessary call to clear the background
*
* @param g the Graphics context in which to paint
*/
public void update(Graphics g) {
paint(g);
}
與之前的同名方法相比
以上是通過自己對雙緩沖的一些理解
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27043.html