老师您好,我照抄了视频中双缓冲机制的代码,但是飞机在移动的时候还是有很严重的闪烁问题,请问是怎么回事?
代码区:
package cn.sxt.game_zyt;
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.*;
/**
* 飞机小游戏0.2版本
*
* @author zyt
*
*0.2版本:
*/
public class PlaneGameFrame extends JFrame {
public static final int WIDTH = 700;
public static final int HEIGHT = 700;
private Image imageBG = null;
//public Plane p = new Plane(50, 300);
private Image bg = GameUtil.getImage("images/bg.jpg");
private Image plane = GameUtil.getImage("images/plane.png");
int x = 50;
int y = 300;
public static void main(String[] zyt) {
PlaneGameFrame pg = new PlaneGameFrame();
pg.launchFrame();
}
public void launchFrame() {
this.setTitle("尚学堂学员_张玉韬");
this.setSize(WIDTH, HEIGHT);
this.setLocation(500, 200);
this.setResizable(false);
new Thread(new repaintThread()).start();
this.setVisible(true);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent arg0) {
System.exit(0);
}
});
}
public void paint(Graphics g) {
g.drawImage(bg, 0, 0, null);
g.drawImage(plane, x, y, null);
x += 5;
}
//双缓冲机制
public void update(Graphics g) {
if(imageBG == null) imageBG = this.createImage(WIDTH, HEIGHT);
Graphics bgImage = imageBG.getGraphics();
//bgImage.drawImage(bg, 0, 0, null);
paint(bgImage);
g.drawImage(imageBG, 0, 0, null);
}
//重画窗口线程
class repaintThread implements Runnable {
public void run() {
while(true) {
try {
Thread.sleep(40);
repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
视频截图:

源码文件包:
PlaneGame0.2.zip