java用applet画图用到的方法(涉及双缓冲)
准备学习java2游戏编程。(其实这是一本书啦)
然后作为基础的基础的基础,必须学习如何让键盘与界面进行交互。下面就是对一个基础得不能再基础的applet程序。
虽然这是个小程序,但其中关于双缓冲概念的介绍是很重要的,要深入理解。(高级噢)
首先先看代码:
packagebear.game.keyevent; importjava.applet.Applet; importjava.awt.Color; importjava.awt.Graphics; importjava.awt.Image; importjava.awt.Rectangle; importjava.awt.event.KeyEvent; importjava.awt.event.KeyListener; publicclassGameextendsAppletimplementsKeyListener{ privateImagebufImage=null; GraphicsbufG=null; @Override publicvoidpaint(Graphicsg){ setBackground(backColor); g.fillRect(r.x,r.y,r.width,r.height); } @Override publicvoidupdate(Graphicsg){ bufImage=createImage(getSize().width,getSize().height); bufG=bufImage.getGraphics(); paint(bufG); g.drawImage(bufImage,0,0,null); } privatestaticfinallongserialVersionUID=1L; privateRectangler; privateColorbackColor; publicvoidinit() { r=newRectangle(0,0,20,10); backColor=Color.WHITE; addKeyListener(this); } @Override publicvoidkeyPressed(KeyEvente){ intkc=e.getKeyCode(); if(kc==KeyEvent.VK_LEFT) { r.x-=5; if(r.x<0) r.x=0; repaint(); } elseif(kc==KeyEvent.VK_RIGHT) { r.x+=5; if(r.x>getSize().width-r.width) r.x=getSize().width-r.width; repaint(); } elseif(kc==KeyEvent.VK_UP) { r.y-=5; if(r.y<0) r.y=0; repaint(); } elseif(kc==KeyEvent.VK_DOWN) { r.y+=5; if(r.y>getSize().height-r.height) r.y=getSize().height-r.height; repaint(); } } @Override publicvoidkeyReleased(KeyEvente){ //TODOAuto-generatedmethodstub } @Override publicvoidkeyTyped(KeyEvente){ //TODOAuto-generatedmethodstub charkc=e.getKeyChar(); switch(kc) { case'r': { backColor=Color.RED; repaint(); break; } case'g': { backColor=Color.GREEN; repaint(); break; } case'b': { backColor=Color.BLUE; repaint(); break; } case'w': { backColor=Color.WHITE; repaint(); break; } } } }
程序比较简单明了,该类继承于Applet并且实现了KeyListener接口。
其成员变量主要包括:一个由我们控制的Rectangle,一个Image和一个Graphics用来实现双缓冲。
我们在init()中将Rectangle初始化,在keyPressed中处理键盘移动事件,在keyTyped中处理键盘修改颜色的事件。
下面重点看的是双缓冲的实现(位于update重载函数中),代码如下:
@Override publicvoidupdate(Graphicsg){ bufImage=createImage(getSize().width,getSize().height); bufG=bufImage.getGraphics(); paint(bufG); g.drawImage(bufImage,0,0,null); }
比方说看动漫的时候,一般一个星期才出一次。所以感觉不是很给力。所以我们可以等它出了很多集之后再一次看完。(好拙的比方)
所以说,双缓冲就是在内存空间中先画好图像,再一次性显示到屏幕上,这与之前先用背景色覆盖,然后再重绘是不同的。
那么为什么之前不重载update会闪烁呢?回答这个问题之前要对awt的重绘的过程有一定的了解。
在awt中对于窗体画布的重绘其条用顺序是repaint() --> update() --> paint()。
所以我们在调用repaint()的时候要进行update,然后呢,我们来看一看update()的源码。(这里指的是super.update)
/** *Updatesthecontainer.Thisforwardstheupdatetoanylightweight *componentsthatarechildrenofthiscontainer.Ifthismethodis *reimplemented,super.update(g)shouldbecalledsothatlightweight *componentsareproperlyrendered.Ifachildcomponentisentirely *clippedbythecurrentclippingsettinging,update()willnotbe *forwardedtothatchild. * *@paramgthespecifiedGraphicswindow *@see Component#update(Graphics) */ publicvoidupdate(Graphicsg){ if(isShowing()){ if(!(peerinstanceofLightweightPeer)){ g.clearRect(0,0,width,height); } paint(g); } }
可以看出super.update()有一个清屏的作用:g.clearRect方法。之后重绘,然后就会出现闪烁。
所以我们利用双缓冲技术可以减缓闪烁的效果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。