欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java用applet畫圖用到的方法(涉及雙緩沖)

 更新時間:2019年06月27日 14:44:26   作者:computingbear  
這篇文章主要介紹了java用applet畫圖用到的方法(涉及雙緩沖),然后作為基礎的基礎的基礎,必須學習如何讓鍵盤與界面進行交互。下面就是對一個基礎得不能再基礎的applet程序,需要的朋友可以參考下

準備學習java2游戲編程。(其實這是一本書啦)

然后作為基礎的基礎的基礎,必須學習如何讓鍵盤與界面進行交互。下面就是對一個基礎得不能再基礎的applet程序。

雖然這是個小程序,但其中關(guān)于雙緩沖概念的介紹是很重要的,要深入理解。(高級噢)

首先先看代碼:

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;
}
}
}
}

程序比較簡單明了,該類繼承于Applet并且實現(xiàn)了KeyListener接口。

其成員變量主要包括:一個由我們控制的Rectangle,一個Image和一個Graphics用來實現(xiàn)雙緩沖。

我們在init()中將Rectangle初始化,在keyPressed中處理鍵盤移動事件,在keyTyped中處理鍵盤修改顏色的事件。

下面重點看的是雙緩沖的實現(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);
}

比方說看動漫的時候,一般一個星期才出一次。所以感覺不是很給力。所以我們可以等它出了很多集之后再一次看完。(好拙的比方)

所以說,雙緩沖就是在內(nèi)存空間中先畫好圖像,再一次性顯示到屏幕上,這與之前先用背景色覆蓋,然后再重繪是不同的。

那么為什么之前不重載update會閃爍呢?回答這個問題之前要對awt的重繪的過程有一定的了解。

在awt中對于窗體畫布的重繪其條用順序是repaint()  -->  update()  -->  paint()。

所以我們在調(diào)用repaint()的時候要進行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.clearRect方法。之后重繪,然后就會出現(xiàn)閃爍。

所以我們利用雙緩沖技術(shù)可以減緩閃爍的效果。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot錯誤處理機制實現(xiàn)原理解析

    Springboot錯誤處理機制實現(xiàn)原理解析

    這篇文章主要介紹了springboot錯誤處理機制實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • Java處理異常2種機制關(guān)鍵字區(qū)別解析

    Java處理異常2種機制關(guān)鍵字區(qū)別解析

    這篇文章主要介紹了java處理異常2種機制關(guān)鍵字區(qū)別解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • 基于Spring MVC的文件上傳和下載實現(xiàn)方法

    基于Spring MVC的文件上傳和下載實現(xiàn)方法

    在Web應用程序中,文件上傳和下載是常見的功能,Spring MVC框架提供了方便的方式來實現(xiàn)這些功能,本文將介紹如何使用Spring MVC實現(xiàn)文件上傳和下載,需要的朋友可以參考下
    2023-05-05
  • Java中的可重入鎖ReentrantLock簡析

    Java中的可重入鎖ReentrantLock簡析

    這篇文章主要介紹了Java中的可重入鎖ReentrantLock簡析,可重入是指同一個線程如果首次獲得了這把鎖,那么因為它是這把鎖的擁有者,因此有權(quán)利再次獲取這把鎖如果是不可重入鎖,那么第二次獲得鎖時,自己也會被鎖擋住,需要的朋友可以參考下
    2023-12-12
  • Java對象轉(zhuǎn)json的方法過程解析

    Java對象轉(zhuǎn)json的方法過程解析

    這篇文章主要介紹了Java對象轉(zhuǎn)json的方法過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • SpringMVC訪問靜態(tài)資源的方法

    SpringMVC訪問靜態(tài)資源的方法

    本篇文章主要介紹了SpringMVC訪問靜態(tài)資源的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • JPA @Query時,無法使用limit函數(shù)的問題及解決

    JPA @Query時,無法使用limit函數(shù)的問題及解決

    這篇文章主要介紹了JPA @Query時,無法使用limit函數(shù)的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java實現(xiàn)上傳網(wǎng)絡圖片到七牛云存儲詳解

    Java實現(xiàn)上傳網(wǎng)絡圖片到七牛云存儲詳解

    這篇文章主要為大家詳細介紹了Java如何實現(xiàn)上傳網(wǎng)絡圖片到七牛云存儲,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-12-12
  • Java SpringBoot安全框架整合Spring Security詳解

    Java SpringBoot安全框架整合Spring Security詳解

    這篇文章主要介紹了Spring Boot整合Spring Security的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09
  • Java中joda日期格式化工具的使用示例

    Java中joda日期格式化工具的使用示例

    這篇文章主要介紹了Java中joda日期格式化工具的使用示例,幫助大家更好的利用Java處理時間,感興趣的朋友可以了解下
    2021-01-01

最新評論