会计考友 发表于 2012-8-4 12:44:44

JAVA认证:双缓冲原理在实现如何消除闪烁(3)

那么怎么通过其他的方法消除swing中的闪烁问题呢,我们此时再回到出发点,双缓冲的核心就是改变paint(g)中的画布,那么好了,我直接在paint(g)函数里实现不就得了,下面再来看这一段代码:
    Java代码
    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);
    }
    有一些相似的部分吧,其中最重要的是super.paint(gImage)这句,改变画布在这里,消除闪烁也是在这里!!!
    下面我们再探讨最后一个问题,即如何理解swing中内置双缓冲,我们首先从继承体系来看,JFrame->Frame->Window->Container->Component,在Frame中的update()方法是从Container中继承而来的,而JFrame中却重写了update()方法如下
    Java代码
    /**
    * Just calls paint(g).This method was overridden to
    * prevent an unnecessary call to clear the background.
    *
    * @param g the Graphics context in which to paint
    */
    public void update(Graphics g) {
    paint(g);
    }
    与之前的同名方法相比,这里直接调用了paint()函数而没有clearRect(),也就是清屏的方法,这里他试图不通过清屏来阻止闪烁的发生。这也就是JFrame本身的一种处理方法。
    以上是通过自己对双缓冲的一些理解,其中还有很多问题,希望牛人们能够积极指出来,并且一起讨论这个问题。
页: [1]
查看完整版本: JAVA认证:双缓冲原理在实现如何消除闪烁(3)