a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 174|回复: 0

[专业语言] JAVA认证:双缓冲原理在实现如何消除闪烁(3)

[复制链接]
发表于 2012-8-4 12:44:44 | 显示全部楼层 |阅读模式
那么怎么通过其他的方法消除swing中的闪烁问题呢,我们此时再回到出发点,双缓冲的核心就是改变paint(g)中的画布,那么好了,我直接在paint(g)函数里实现不就得了,下面再来看这一段代码:! Y- @/ C+ W) d" q7 C
    Java代码
! h1 h: e& [$ f( b) x9 p* Y& B& J. [    public void paint(Graphics g)
: {0 m0 m+ B& A: p* g" ^    {# G+ j  A$ I1 k) [
    // 在重绘函数中实现双缓冲机制
9 t& x7 f& u3 }' D5 w+ i    offScreenImage = this.createImage(WIDTH, HEIGHT);3 B9 ]" l. R0 j8 g
    // 获得截取图片的画布' s2 ^% `3 N# w3 M) l/ c
    gImage = offScreenImage.getGraphics();
4 u: i# q6 e! D0 B4 Q    // 获取画布的底色并且使用这种颜色填充画布,如果没有填充效果的画,则会出现拖动的效果3 s0 z4 \* E, q
    gImage.setColor(gImage.getColor());+ X/ C4 S& ~6 }
    gImage.fillRect(0, 0, WIDTH, HEIGHT); // 有清楚上一步图像的功能,相当于gImage.clearRect(0, 0, WIDTH, HEIGHT). ?, J) t* i. P- h, x/ U6 r
    // 调用父类的重绘方法,传入的是截取图片上的画布,防止再从最底层来重绘
1 Z# h5 b% O+ _$ N8 j    super.paint(gImage);- W$ j6 V2 z4 Y, q! E
    // 当游戏没有结束的时候绘出对战双方
# w3 s, w1 q% J# B% o6 g# p8 t    if (!getGameOver()) {
0 ^+ t  ]4 K- w$ F2 C0 V    // 画出自己的坦克* I# R! Q- b1 @/ i! y
    paintMyTank(gImage);  E* t- E2 o4 U9 i2 \: u" Z( M9 [. c
    // 画出自己坦克发射的子弹
! H; E) ]. b5 i: z0 u9 @9 r0 `* F    paintMyBullet(gImage);
' u, v# `( J, |' v' m8 I    // 画出敌方坦克
, \4 \2 h. F+ g6 Q# S, s% R1 t    paintEnemyTank(gImage);: n( h& |/ T* ?5 S9 F. h
    // 画出敌方坦克发射的子弹: A+ C8 `' ]% Q1 H
    paintEnemyBullet(gImage);5 o$ w; J$ K5 |0 b! M: g, |& Q9 e
    }7 F  N( j/ H% D* [! T' s
    // 画出草地
7 r& j" t) U9 u( o1 S7 }+ m" D2 N    paintGrass(gImage);
  o# j- p: q; C, b    // 画出小河, e4 p4 c- r2 T5 o4 p  _9 C& w
    paintRiver(gImage);
, p' Y* J0 S4 C4 ]    // 画出石头5 t( R' t9 g5 X- \  ]
    paintStone(gImage);
, ]! ^& I' Z# e9 U    // 画出各种道具6 K& B- x" d% R) S" K, U
    paintTool(gImage);
, |! v" D. R3 @    // 将接下来的图片加载到窗体画布上去,才能考到每次画的效果7 f7 i9 A& m& h2 y+ ~; O' b" f
    g.drawImage(offScreenImage, 0, 0, null);& M, f* F! J  E0 i4 K
    }# _# R) X6 R% h6 i! z: F
    有一些相似的部分吧,其中最重要的是super.paint(gImage)这句,改变画布在这里,消除闪烁也是在这里!!!
& ?+ {% C: [& G7 ^    下面我们再探讨最后一个问题,即如何理解swing中内置双缓冲,我们首先从继承体系来看,JFrame->Frame->Window->Container->Component,在Frame中的update()方法是从Container中继承而来的,而JFrame中却重写了update()方法如下  H! A$ ^& i; V2 x6 L% J4 k
    Java代码3 V9 k% A0 z: ^
    /**
% K* Q) y7 P; P9 b+ p2 h" f( W+ Z    * Just calls paint(g).  This method was overridden to
6 k* j7 G  e; s/ _    * prevent an unnecessary call to clear the background.7 t# D" P: {9 G6 ^/ d
    *
# H" }) t9 S; _5 k    * @param g the Graphics context in which to paint& n7 G2 @: x6 e% n) w* A
    *// K$ b& Y! B1 @$ {' d+ ^
    public void update(Graphics g) {
9 P( k  c  P" d. C/ |* j0 L; p    paint(g);
. m/ S8 z& @. e% K) n. N8 m    }, p: e6 z1 i, v* s' Q
    与之前的同名方法相比,这里直接调用了paint()函数而没有clearRect(),也就是清屏的方法,这里他试图不通过清屏来阻止闪烁的发生。这也就是JFrame本身的一种处理方法。& i& A6 P5 M) U+ c$ _! ]
    以上是通过自己对双缓冲的一些理解,其中还有很多问题,希望牛人们能够积极指出来,并且一起讨论这个问题。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-9-27 21:10 , Processed in 2.792400 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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