关于双缓存技术本身没有难点,以前在研究android的时候,虽遇到过类似问题,但是很快解决,今天在研究j2se的时候,再次研究j2se的双缓存实现,有些地方不甚明白。先说问题。下面是一段在继承frame类之后,重写updata方法,以达到双缓存目的的代码。之所以重写updata方法,是因为repaint之后会调用updata再调用paint方法。
private Image image_buf = null;
private Graphics g_buf = null; public void update(Graphics g) {
image_buf = createImage(screenWidth, screenHeight);
g_buf = image_buf.getGraphics();
paint(g_buf);
g.drawImage(image_buf, 0, 0, null);
}
问题来了
问题一:在调用paint方法的时候,传入一个新画布g_buf,这个paint应该就是指向我们重写的paint方法,但是系统是如何拿到这个画布g_buf的?
问题二:最后一句要drawImage,把新建的image_buf对象传入,我个人觉得这像是在把画布清屏,因为image_buf是空的。不明白这句代码的意义。在android中,surfaceview默认有双缓存技术,每次lockCanvas得到的都是上一次绘制的图形,但是实际今天发现每次获得的Canvas的hashCode竟然是一样的,也就是说是同一个对象,那么他是如何实现的呢?个人觉得这些问题是因为我对程序绘图的机制不了解造成的,究竟把图形显示在屏幕上,系统干了些什么,希望大牛帮忙解答。绘图双缓存图形

解决方案 »

  1.   

    绘图的话继承JComponent,重写它的paintComponent(Graphics g)方法,Swing已经默认使用了双缓冲。
    如果计算多的话,先把要绘制的东西在BufferedImage里绘制好,再一次性绘制到屏幕上,这个在Swing上是三缓冲了。update()方法是AWT时代的产物,Swing已经不用了。
      

  2.   


    确实在JFrame中,updata已经无用了。但是继承JFrame的话,也会出现闪烁现象,这是怎么回事呢?
      

  3.   

    我搞错了..JFrame不是JComponent的子类..
    但是我还是不明白我上面提的两个问题