java用applet画图用到的方法(涉及双缓冲)

 更新时间:2019年06月27日 14:44:26   作者:computingbear  
这篇文章主要介绍了java用applet画图用到的方法(涉及双缓冲),然后作为基础的基础的基础,必须学习如何让键盘与界面进行交互。下面就是对一个基础得不能再基础的applet程序,需要的朋友可以参考下

准备学习java2游戏编程。(其实这是一本书啦)

然后作为基础的基础的基础,必须学习如何让键盘与界面进行交互。下面就是对一个基础得不能再基础的applet程序。

虽然这是个小程序,但其中关于双缓冲概念的介绍是很重要的,要深入理解。(高级噢)

首先先看代码:

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并且实现了KeyListener接口。

其成员变量主要包括:一个由我们控制的Rectangle,一个Image和一个Graphics用来实现双缓冲。

我们在init()中将Rectangle初始化,在keyPressed中处理键盘移动事件,在keyTyped中处理键盘修改颜色的事件。

下面重点看的是双缓冲的实现(位于update重载函数中),代码如下:

@Override
public void update(Graphics g) {
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)

/**
* 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方法。之后重绘,然后就会出现闪烁。

所以我们利用双缓冲技术可以减缓闪烁的效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SpringMVC利用dropzone组件实现图片上传

    SpringMVC利用dropzone组件实现图片上传

    这篇文章主要介绍了SpringMVC利用dropzone组件实现图片上传,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • Java之Jackson的基本使用案例讲解

    Java之Jackson的基本使用案例讲解

    这篇文章主要介绍了Java之Jackson的基本使用案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • mybatis plus or and 的合并写法实例

    mybatis plus or and 的合并写法实例

    这篇文章主要介绍了mybatis plus or and 的合并写法实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • MyBatis缓存实现原理及代码实例解析

    MyBatis缓存实现原理及代码实例解析

    这篇文章主要介绍了MyBatis缓存实现原理及代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot配置Apollo代码实例

    SpringBoot配置Apollo代码实例

    这篇文章主要介绍了SpringBoot配置Apollo代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 浅谈Java垃圾回收机制

    浅谈Java垃圾回收机制

    Java 中,程序员不需要关心所有不再使用的对象。垃圾回收机制自动销毁这些对象。垃圾回收机制是守护线程的最佳示例,因为它始终在后台运行。垃圾回收机制的主要目标是通过销毁无法访问的对象来释放堆内存。下面我们就来详细介绍吧
    2021-09-09
  • 一文简介Java中BlockingQueue阻塞队列

    一文简介Java中BlockingQueue阻塞队列

    本文主要介绍了一文简介Java中BlockingQueue阻塞队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Spring Boot Aop执行顺序深入探究

    Spring Boot Aop执行顺序深入探究

    这篇文章主要为大家介绍了Spring Boot Aop执行顺序深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Java实现数据脱敏的方法详细讲解

    Java实现数据脱敏的方法详细讲解

    这篇文章主要给大家介绍了关于Java实现数据脱敏的相关资料,数据脱敏是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护,需要的朋友可以参考下
    2023-06-06
  • Java的方法和this关键字如何理解与应用

    Java的方法和this关键字如何理解与应用

    Java语言中的“方法”(Method)在其他语言当中也可能被称为“函数”(Function)。对于一些复杂的代码逻辑,如果希望重复使用这些代码,并且做到“随时任意使用”,那么就可以将这些代码放在一个大括号{}当中,并且起一个名字。使用代码的时候,直接找到名字调用即可
    2021-10-10

最新评论