java用applet畫圖用到的方法(涉及雙緩沖)
準(zhǔn)備學(xué)習(xí)java2游戲編程。(其實(shí)這是一本書啦)
然后作為基礎(chǔ)的基礎(chǔ)的基礎(chǔ),必須學(xué)習(xí)如何讓鍵盤與界面進(jìn)行交互。下面就是對(duì)一個(gè)基礎(chǔ)得不能再基礎(chǔ)的applet程序。
雖然這是個(gè)小程序,但其中關(guān)于雙緩沖概念的介紹是很重要的,要深入理解。(高級(jí)噢)
首先先看代碼:
package bear.game.keyevent; import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class Game extends Applet implements KeyListener{ private Image bufImage = null; Graphics bufG = null; @Override public void paint(Graphics g) { setBackground(backColor); g.fillRect(r.x, r.y, r.width, r.height); } @Override public void update(Graphics g) { bufImage = createImage(getSize().width, getSize().height); bufG = bufImage.getGraphics(); paint(bufG); g.drawImage(bufImage, 0, 0, null); } private static final long serialVersionUID = 1L; private Rectangle r; private Color backColor; public void init() { r = new Rectangle(0, 0, 20, 10); backColor = Color.WHITE; addKeyListener(this); } @Override public void keyPressed(KeyEvent e) { int kc = e.getKeyCode(); if(kc == KeyEvent.VK_LEFT) { r.x -= 5; if(r.x < 0) r.x = 0; repaint(); } else if(kc == KeyEvent.VK_RIGHT) { r.x += 5; if(r.x > getSize().width - r.width) r.x = getSize().width - r.width; repaint(); } else if(kc == KeyEvent.VK_UP) { r.y -= 5; if(r.y < 0) r.y = 0; repaint(); } else if(kc == KeyEvent.VK_DOWN) { r.y += 5; if(r.y > getSize().height - r.height) r.y = getSize().height - r.height; repaint(); } } @Override public void keyReleased(KeyEvent e) { // TODO Auto-generated method stub } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub char kc = 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; } } } }
程序比較簡(jiǎn)單明了,該類繼承于Applet并且實(shí)現(xiàn)了KeyListener接口。
其成員變量主要包括:一個(gè)由我們控制的Rectangle,一個(gè)Image和一個(gè)Graphics用來實(shí)現(xiàn)雙緩沖。
我們?cè)趇nit()中將Rectangle初始化,在keyPressed中處理鍵盤移動(dòng)事件,在keyTyped中處理鍵盤修改顏色的事件。
下面重點(diǎn)看的是雙緩沖的實(shí)現(xiàn)(位于update重載函數(shù)中),代碼如下:
@Override public void update(Graphics g) { bufImage = createImage(getSize().width, getSize().height); bufG = bufImage.getGraphics(); paint(bufG); g.drawImage(bufImage, 0, 0, null); }
比方說看動(dòng)漫的時(shí)候,一般一個(gè)星期才出一次。所以感覺不是很給力。所以我們可以等它出了很多集之后再一次看完。(好拙的比方)
所以說,雙緩沖就是在內(nèi)存空間中先畫好圖像,再一次性顯示到屏幕上,這與之前先用背景色覆蓋,然后再重繪是不同的。
那么為什么之前不重載update會(huì)閃爍呢?回答這個(gè)問題之前要對(duì)awt的重繪的過程有一定的了解。
在awt中對(duì)于窗體畫布的重繪其條用順序是repaint() --> update() --> paint()。
所以我們?cè)谡{(diào)用repaint()的時(shí)候要進(jìn)行update,然后呢,我們來看一看update()的源碼。(這里指的是super.update)
/** * Updates the container. This forwards the update to any lightweight * components that are children of this container. If this method is * reimplemented, super.update(g) should be called so that lightweight * components are properly rendered. If a child component is entirely * clipped by the current clipping setting in g, update() will not be * forwarded to that child. * * @param g the specified Graphics window * @see Component#update(Graphics) */ public void update(Graphics g){ if(isShowing()) { if(!(peer instanceof LightweightPeer)){ g.clearRect(0, 0, width, height); } paint(g); } }
可以看出super.update()有一個(gè)清屏的作用:g.clearRect方法。之后重繪,然后就會(huì)出現(xiàn)閃爍。
所以我們利用雙緩沖技術(shù)可以減緩閃爍的效果。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot錯(cuò)誤處理機(jī)制實(shí)現(xiàn)原理解析
這篇文章主要介紹了springboot錯(cuò)誤處理機(jī)制實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04Java處理異常2種機(jī)制關(guān)鍵字區(qū)別解析
這篇文章主要介紹了java處理異常2種機(jī)制關(guān)鍵字區(qū)別解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01基于Spring MVC的文件上傳和下載實(shí)現(xiàn)方法
在Web應(yīng)用程序中,文件上傳和下載是常見的功能,Spring MVC框架提供了方便的方式來實(shí)現(xiàn)這些功能,本文將介紹如何使用Spring MVC實(shí)現(xiàn)文件上傳和下載,需要的朋友可以參考下2023-05-05Java中的可重入鎖ReentrantLock簡(jiǎn)析
這篇文章主要介紹了Java中的可重入鎖ReentrantLock簡(jiǎn)析,可重入是指同一個(gè)線程如果首次獲得了這把鎖,那么因?yàn)樗沁@把鎖的擁有者,因此有權(quán)利再次獲取這把鎖如果是不可重入鎖,那么第二次獲得鎖時(shí),自己也會(huì)被鎖擋住,需要的朋友可以參考下2023-12-12Java對(duì)象轉(zhuǎn)json的方法過程解析
這篇文章主要介紹了Java對(duì)象轉(zhuǎn)json的方法過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09JPA @Query時(shí),無法使用limit函數(shù)的問題及解決
這篇文章主要介紹了JPA @Query時(shí),無法使用limit函數(shù)的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03Java實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到七牛云存儲(chǔ)詳解
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)上傳網(wǎng)絡(luò)圖片到七牛云存儲(chǔ),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-12-12Java SpringBoot安全框架整合Spring Security詳解
這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2021-09-09