以上原文from:
http://blog.csdn.net/weizhaozhe/archive/2009/03/03/3951521.aspx
/**
*双缓冲
*什么是重量级,轻量级
*轻量级在这里指用纯java实现的。重量级指和其他语言混合编程,这样耗用的资源多系统触发的绘画操作
*绘画操作的分类
*系统触发的和程序触发的绘画操作
*AWT的绘制与界面更新使用了一个单独的线程,称为AWT线程。这个线程可以在两种情形下更新显示。
*一种情况是界面“显露”,这可能会发生在界面首次显示时,或者界面某一部分由于被其它窗口遮盖后重新显示时。界面显露的处理是AWT自动进行的,。
*第二种情况是程序在显示内容有所改变时进行界面的更新,而这一般是由应用程序的逻辑来控制的。
*
*repaint() update()paint()
* 当我们应用程序的逻辑要对系统界面进行更新时,调用repaint() 方法来通知AWT线程进行刷新操作。repaint() 方法实际会让AWT线程去调用另外一个方法,update。update方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其paint()方法完成实际绘制工作。
*第一个优化工作就是重写update() 方法,也就是不对当前区域进行清除工作,而直接进行绘制.
*paint(g) 中的g代表屏幕对象,直接对代表屏幕对象的Graphics对象进行操作,而这个操作是比较费时的操作。解决的办法是采用“双缓冲”,即我们创建一个绘制缓冲区,以bufImage表示,先将主要的图形元素一个一个地绘制到此缓冲图像上,再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即 paint() 方法传入的“g”上。
*
*paint(g);直接对代表屏幕对象的Graphics 对象进行操作,而这个操作是比较费时的操作。
*重写update()步骤:
*得到缓冲图象this.offScreenImage = this.createImage(800,600);
*看APIcreateImage用来创建一幅用于双缓冲的、可在屏幕外绘制的图像。
*得到缓冲图象的画笔Graphics offg = this.offScreenImage.getGraphics();
*绘制缓冲图象offg.setColor(Color.GREEN);
*调用paint(),将缓冲图象的画笔传入
*再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g” 上. g.drawImage(offScreenImage, 0, 0, null);
*双缓冲问题只在AWT中存在,swing中已内置解决方案
*/
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class TankClient extends Frame ...{
private static final long serialVersionUID = 1L;
private int X = 50, Y = 50;
private int GAME_WIDTH = 800;
private int GAME_HEIGHT = 600;
private Image offScreenImage;
public static void main(String[] args) ...{
TankClient tc = new TankClient();
tc.launchFrame();
}
@Override
public void update(Graphics g) ...{
//1.得到缓冲图像
if(this.offScreenImage == null) ...{
this.offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
//2.得到缓冲图像的画笔
Graphics gOffScreen = this.offScreenImage.getGraphics();
//3.绘制缓冲图像
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.GREEN);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
//4.调用paint(),将缓冲图象的画笔传入
paint(gOffScreen);
//5.再将此缓冲图像一次性绘到代表屏幕的Graphics对象,即该方法传入的“g”上
g.drawImage(offScreenImage, 0, 0, null);
}
@Override
public void paint(Graphics g) ...{
Color c = g.getColor();
g.setColor(Color.RED);
g.fillOval(X, Y, 30, 30);
g.setColor(c);
Y += 5;
}
public void launchFrame() ...{
this.setBounds(100, 100, GAME_WIDTH, GAME_HEIGHT);
this.setBackground(Color.GREEN);
this.addWindowListener(new WindowAdapter() ...{
public void windowClosing(WindowEvent e) ...{
setVisible(false);
System.exit(0);
}
});
this.setTitle("TankWar");
this.setResizable(false);
this.setVisible(true);
new Thread(new PaintThread()).start();
}
class PaintThread implements Runnable ...{
public void run() ...{
while (true) ...{
repaint();
try ...{
Thread.sleep(50);
} catch (InterruptedException e) ...{
e.printStackTrace();
}
}
}
}
}
分享到:
相关推荐
JAVA中GUI编程,AWT窗体上绘图,利用双缓冲解决画面闪烁效果!
什么是AWT 用AWT构建GUI 事件处理 AWT组件类库
awt包java Android awt包java Android awt包java Android awt包java Android awt包java Android awt包java Android awt包java Android awt包java Android awt包java Android awt包java Android awt包java Android ...
java关于事件的处理 awt及awt事件处理
java绘图 java awt 经典绘图的例子,对于初学awt模块的人非常有帮助.
用AWT把实现的JAVA计算器
awt,即各项异性小波变换的matlab实现
AWT Framework is a lightweight framework for building AWT applications. Layout is configed by XML files. Events and View Switchs is managed by framework. Also you can plugin your customized AWT or ...
主要解决屏闪的问题,利用在内存画好后在贴出来。
4.1 AWT工具集简介 4.2 AWT事件模型 4.3 GUI组件上的图形操作 4.4 常用的AWT组件
Java的AWT包.pdf 学习资料 复习资料 教学资源
实用awt 控件
自己写的awt版的记事本, 有事件,有布局,有功能..
java的awt小练习,包括关机 取消关机 启动bat程序 关闭某个进程 启动电脑某exe文件
为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT 不得不通过牺牲功能来实现其平台无关性,也就是说,AWT 所提供的图形功能是各种通用型操作系统所提供的图形功能的交集。由于AWT 是依靠本地方法来实现其...
java awt 带界面简单日期选择程序
java的awt计算器用java编写一个具有图形界面的简单计算器
对照了解AWT与Swing的区别,能更好地理解GUI
通讯录 java swing awt oracle