双缓冲消除闪烁在重量级Frame和轻量级组件Jframe中的区别

来源:互联网 发布:ntfs for mac 10.12.6 编辑:程序博客网 时间:2024/05/16 19:11
以下均为个人理解,如有疏漏请指正。

1,基本调用关系

类 Component

1.paint(Graphics g)的定义:

public void paint(Graphics g)
绘制此组件。

应该绘制组件的内容时调用此方法;例如首次显示组件或者组件已损坏并需要修复时。Graphics 参数中的剪贴区矩形设置为需要绘制的区域。重写此方法的Component 子类不需要调用 super.paint(g)

出于性能的考虑,首次显示宽度或高度为 0 的 Component 时认为它不需要进行绘制,并且也不需要修复。 

2.update(Graphics g)的定义:

public void update(Graphics g)
更新组件。

如果此组件不是轻量级组件,则为了响应对 repaint 的调用,AWT 调用 update 方法。可以假定未清除背景。

Componentupdate 方法调用此组件的 paint 方法来重绘此组件。为响应对repaint 的调用而需要其他工作的子类通常重写此方法。重写此方法的 Component 子类应该调用 super.update(g),或者直接从其update 方法中调用 paint(g)。 


3.repaint()在api中的定义:

public void repaint()
重绘此组件。

如果此组件是轻量级组件,则此方法会尽快调用此组件的 paint 方法。否则此方法会尽快调用此组件的 update 方法。 

综上:

轻量级组件 repaint()直接调用paint()
重量级组建repaint()调用update()调用paint()

2.解决方案

1.Frame等重量级组件:

重写update()

私有变量 Imagine offScreenImage=null;
  1.  public void update(Graphics g)    {           if(offScreenImage == null)              offScreenImage = this.createImage(800, 600);     //新建一个图像缓存空间,这里图像大小为800*600              Graphics gImage = offScreenImage.getGraphics();//得到画笔  <span style="white-space:pre"> gImage.setColor(gImage.getColor());  </span>  gImage.fillRect(0, 0, WIDTH, HEIGHT); //填充缓存图像            paint(gImage);                                   //先绘制在缓存空间            g.drawImage(offScreenImage, 0, 0, null);         //再绘制在屏幕上  }   }  

2.Jframe等轻量级组件:

  1. public void paint(Graphics g) {     
  2.         // 在重绘函数中实现双缓冲机制    
  3.         offScreenImage = this.createImage(WIDTH, HEIGHT);     
  4.         // 获得截取图片的画布    
  5.         gImage = offScreenImage.getGraphics();      
  6.         gImage.setColor(gImage.getColor());     
  7.         gImage.fillRect(00, WIDTH, HEIGHT); // 填充缓冲  
  8.         super.paint(gImage);     
  9.     用gImage绘制图形
  10.        代码根据具体情况
  11.     
  12.         g.drawImage(offScreenImage, 00null);    //将缓冲图案绘制在屏幕上 
  13.     }   

3.归纳:

以上两种方案根据repaint()调用顺序决定重写哪个方法,其基本思想都是在缓冲图像上绘制好图像一次显示在屏幕上,避免了直接绘制时由于绘制过程和清屏导致的图像遗留和闪烁。

0 0