Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 303|回复: 0

[Swing学习]如何在 Graphics中使用双缓冲

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-28 23:55:19 | 显示全部楼层 |阅读模式
       首先你需要知道的是,如果你是在一个Swing组件上作图的话,
    Swing已经自动的为你实现了双缓冲,因此没有必要在这个问题上上脑筋了。

    如果你使用的是AWT组件的话,你可以根据下面的流程使用双缓冲:

    利用该组件之createImage()方法创建一个BufferedImage对象
    利用BufferedImage的createGraphics()方法得到适当的Graphics对象
    在得到的Graphics对象上作图
    将做出的图形显示到该组件之Graphics对象上。

    下面的代码片断实现了上述流程,其中g 是图形显示组件之Graphics对象。

    Image bi = createImage(w, h);
    Graphics big = bi.createGraphics();
    // draw somthing
    g.drawImage(bi, 0, 0, this);

    关于双缓冲技术的详细内容,可以参考java Tutorial中的2D Graphics。

       
      
       
       
         
       
                         
         
       
      
      
      
    下面是一个使用双缓冲的例子,点击观看: import java.awt.*;
    import java.applet.*;
        public class sfish extends Applet implements Runnable{
              int xpos=0;
              Thread anime=null;
              Image fish_img;
              Image offscreen_buf=null;
              int fish_width,fish_height;
            public  void init(){
               fish_img=getImage(getCodeBase(),"images/fish.gif");
               fish_width=60;
               fish_height=80;
            }
            public void start(){
               if(anime==null){
                   anime=new Thread(this);
                   anime.start();
               }
            }
             public void paint(Graphics g){
                g.drawImage(fish_img,xpos,50,this);
             }
             public boolean imageUpdate(Image img,int flage,int x,int y,int w,int h){
                 if(flage==ALLBITS){
                      Graphics g1=getGraphics();
                       paint(g1);
                       return false;
                  }
                  return true;
             }
            public void run(){
                while(anime!=null){
                  if(offscreen_buf==null){
                     offscreen_buf=createImage(getSize().width,getSize().height);
                  }
                  Rectangle old_area=new Rectangle(xpos,50,fish_width,fish_height);
                  xpos+=10;
                  if(xpos>getSize().width)
                   xpos=0;
                   Rectangle new_area=new Rectangle(xpos,50,fish_width,fish_height);
                   Graphics offg=offscreen_buf.getGraphics();
                   offg.setColor(Color.white);
                   offg.fillRect(0,0,getSize().width,getSize().height);
                   
                    paint(offg);
                   Graphics ong=getGraphics();
                   ong.drawImage(offscreen_buf,0,0,this);
                   try{
                       Thread.sleep(300);
                    }catch(InterruptedException e){};
                 }
            }
        }
    [/code]
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 04:37 , Processed in 0.290828 second(s), 36 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表