JAVA双缓冲问题

 

*当我们应用程序的逻辑要对系统界面进行更新时,调用repaint() 方法来通知AWT线程进行刷新操作。repaint() 方法实际会让AWT线程去调用另外一个方法,update。update方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其paint()方法完成实际绘制工作。
*第一个优化工作就是重写update() 方法,也就是不对当前区域进行清除工作,而直接进行绘制.
*paint(g)中的g代表屏幕对象,直接对代表屏幕对象的Graphics对象进行操作,而这个操作是比较费时的操作。解决的办法是采用“双缓冲”,即我们创建一个绘制缓冲区,以bufImage表示,先将主要的图形元素一个一个地绘制到此缓冲图像上,再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即paint() 方法传入的“g”上。所以主要就是要重写update和paint方法
  @Override
    public void update(Graphics g)
    {
    //1.得到缓冲图像
    this.buffer = (BufferedImage) createImage(width,height);
   
        //2.得到缓冲图像的画笔
        Graphics gOffScreen = this.buffer.getGraphics();
        //3.绘制缓冲图像
ImageIcon img = new ImageIcon(
"images/chatDialog/chatDialog.png");
           gOffScreen.drawImage(img.getImage(), 0, 0,width,height, null);
        //4.调用paint(),将缓冲图象的画笔传入
        paint(gOffScreen);
        //5.再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g”上
        g.drawImage(buffer, 0, 0, null);
    }
   
    @Override
    public void paint(Graphics g)
    {

ImageIcon img = new ImageIcon(
"images/chatDialog/chatDialog.png");
           g.drawImage(img.getImage(), 0, 0,width,height, null);
    }

你可能感兴趣的:(java)