欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java 双缓冲技术解决屏幕闪烁问题

程序员文章站 2022-07-05 12:30:14
...

在线程run()方法中调用repaint()方法来对界面重绘,就达到动画的效果。当运行程序的时候发现,屏幕闪的厉害。查看程序,发现线程run()中while()循环每循环一次界面就要重绘一次,这才导致屏幕频繁的闪烁。。

 

       深入分析,这个repaint()方法是从父类JFrame继承来的,当repaint方法执行的时候会调用update(Graphics g)方法,而update()方法里面首先判断是否轻量组件,如果是那么用背景色覆盖掉界面g.clearRect(0,0,width,height),然后再调用paint()方法,意思就是先清理掉当前,然后画下一个画面,所谓屏幕闪烁就是清理和重绘的过程,那么如何解决呢,貌似要达到动画的效果就必须先清理再重绘。。。咋办呢

 

       屏幕闪动总是那么的让人无法忍受,于是我上网搜了一下解决方法,乍看下去都是说的用双缓冲技术来解决。。小弟为了让屏幕冷静下来不要那么激动就自学了一下,下面我来说说我的理解。。

       所谓双缓冲,就是在内存中重新开辟新空间,作为后台图像,然后把本来要在界面上进行的清理和重绘在后台处理好,生成一幅新的画面,最后再显示在界面上。

       原理总是很简单的,实现起来时怎样呢?

 

       首先要定义两个私有变量,一个是后台图像iBuffer,一个是后台图像的画布对象gBuffer。这也就是所谓的双缓冲。然后通过一段程序来帮助理解:

public void update(Graphics g)  
  {  
         if(offScreenImage == null)  
            offScreenImage = this.createImage(500, 500);     //新建一个图像缓存空间,这里图像大小为800*600  
            Graphics gImage = offScreenImage.getGraphics();  //把它的画笔拿过来,给gImage保存着  
            paint(gImage);                                   //将要画的东西画到图像缓存空间去  
            g.drawImage(offScreenImage, 0, 0, null);         //然后一次性显示出来  
  }  


      将本来要在界面上实现的操作(画面的清理和重绘)在后台就实现好,然后绘制成一幅画面,最后在界面上显示这个画面,从而消除屏幕的闪烁,问题也随之解决。