java用applet画图用到的方法(涉及双缓冲)
作者:computingbear 发布时间:2021-07-09 17:27:32
准备学习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方法。之后重绘,然后就会出现闪烁。
所以我们利用双缓冲技术可以减缓闪烁的效果。
来源:https://blog.csdn.net/computingbear/article/details/7981729


猜你喜欢
- Java多线程线程的创建1.继承Thread2.实现Runnable3.实现Callable使用继承Thread类来开发多线程的应用程序在设
- 一、前言想要自定义starter组件,首先要了解springboot是如何加载starter的,也就是springboot的自动装配机制原理
- 1、使用排序2、原理事实上Collections.sort方法底层就是调用的array.sort方法,而且不论是Collections.so
- 关于死信队列在大多数的MQ中间件中,都有死信队列的概念。死信队列同其他的队列一样都是普通的队列。在RabbitMQ中并没有特定的“死信队列”
- 最近学了点kotlin的相关知识,顺手写了一个简单的五子棋单机游戏,分享给大家吧!有兴趣的可以看看五子棋界面package wjc.kotl
- 一、Widget设计步骤需要修改三个XML,一个class:1.第一个xml是布局XML文件(如:main.xml),是这个widget的。
- 1.过滤器:所谓过滤器顾名思义是用来过滤的,在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一
- 前言以下为本文要记录的大概内容:Java基础案例:两只老虎、三个和尚、考试奖励以下是本篇文章正文内容,仅供参考一、案例1:两只老虎1.题目:
- 线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。当线程进入对象的synchronized代
- 本文汇总了Spring的常用注解,以方便大家查询和使用,具体如下:使用注解之前要开启自动扫描功能其中base-package为需要扫描的包(
- tomcat中文乱码问题这几天测试的兄弟发现了项目中存在乱码问题 经过排查发现是tomcat中的问题 于是在server.xml中添加了如下
- 1.建议设置窗体为双缓冲绘图,可有效避免界面刷时引起的闪烁this.SetStyle(ControlStyles.AllPaintingIn
- 如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HT
- 好几年没写博客了,很多知识不记是真的会忘记,以后还是保持写博客的习惯吧。坚持不一定成功,但放弃一定很舒服!(开玩笑(#^.^#))回归正题,
- 指针的概念:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指
- 在android移动端的开发中,首页轮播图是一个特别常见的功能,所以今天就来将最近写的一个小demo记录一下。首先当然是新建一个项目代码如下
- 本文实例为大家分享了Android实现QQ图片说说照片选择的具体代码,供大家参考,具体内容如下效果展示布局文件布局是很简单的,一个GridV
- 本文实例讲述了Android编程简易实现XML解析的方法。分享给大家供大家参考,具体如下:首先创建在Android工程中创建一个Assets
- 本文实例为大家分享了Chronometer实现倒计时功能,Android提供了实现按照秒计时的API,供大家参考,具体内容如下一、自定义Ch
- .NET包含一个特殊的Object类,可以接受任意的数据类型的值,当所传递或所赋值的类型不是一个特定的数据类型时,object类就提供了一种