public void paint(Graphics g) { // 在重绘函数中实现双缓冲机制 offScreenImage = this.createImage(WIDTH, HEIGHT); // 获得截取图片的画布 gImage = offScreenImage.getGraphics(); // 获取画布的底色并且使用这种颜色填充画布,如果没有填充效果的画,则会出现拖动的效果 gImage.setColor(gImage.getColor()); gImage.fillRect(0, 0, WIDTH, HEIGHT); // 有清楚上一步图像的功能,相当于gImage.clearRect(0, 0, WIDTH, HEIGHT) // 调用父类的重绘方法,传入的是截取图片上的画布,防止再从最底层来重绘 super.paint(gImage); // 当游戏没有结束的时候绘出对战双方 if (!getGameOver()) { // 画出自己的坦克 paintMyTank(gImage); // 画出自己坦克发射的子弹 paintMyBullet(gImage); // 画出敌方坦克 paintEnemyTank(gImage); // 画出敌方坦克发射的子弹 paintEnemyBullet(gImage); } // 画出草地 paintGrass(gImage); // 画出小河 paintRiver(gImage); // 画出石头 paintStone(gImage); // 画出各种道具 paintTool(gImage); // 将接下来的图片加载到窗体画布上去,才能考到每次画的效果 g.drawImage(offScreenImage, 0, 0, null); } 这篇文章的这段代码,可以实现JFrame 的双缓冲。而且,必须在定义完gimage时,就去调用super.paint(image),而不能是在gimage.setColor之后,否则的话就会导致背景的颜色没法显示。