思路是:在内存中开辟一块和当前绘图区一样大的buffer区域,所有的绘制工作都在这个buffer中完成。然后调用drawImage方法将这个buffer中的内容绘制到屏幕上
书上的例子,供参考:
/*从Java2 complete reference中剽的一个关于双缓冲的例子
*用的是applet表现的
*基本原理:
*首先获得你的屏幕绘图区域的大小;
*进而在内存中开辟一个同样大小的缓冲区域
*将所有的绘图操作在内存中的缓冲中进行
*从而防止在屏幕进行绘图产生的闪烁
*覆盖update()方法从而防止用底色刷新屏幕时的闪烁
*/
import java.awt.*;
import java.awt.event.*;
import java.applet.*;/*
<applet code="DoubleBuffer" width=250 height=250>
</applet>
*/public class DoubleBuffer extends Applet
{
int gap = 3;
int mx, my;
boolean flicker = true;
Image buffer = null;
int w, h;
public void init()
{
Dimension d = getSize();
//获取用户屏幕的大小
w = d.width;
h = d.height;
buffer = createImage(w, h);
//以同样的大小在内存中开辟一块缓冲区,并将buffer指向它
addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent me)
{
mx = me.getX();
my = me.getY();
flicker = false;
repaint();
}
public void mouseMoved(MouseEvent me)
{
mx = me.getX();
my = me.getY();
flicker = true;
repaint();
}
});
}
public void paint(Graphics g)
{
Graphics screengc = null;
if(!flicker)
{
screengc = g;
g = buffer.getGraphics();
//将g指向缓冲区域
}
g.setColor(Color.blue);
g.fillRect(0, 0, w, h);
g.setColor(Color.red);
for(int i=0; i<w; i+=gap)
g.drawLine(i, 0, w-i, h);
for(int i=0; i<h; i+=gap)
g.drawLine(0, i, w, h-i);
g.setColor(Color.black);
g.drawString("Press mouse button to double buffer", 10, h/2);
g.setColor(Color.yellow);
g.fillOval(mx-gap, my-gap, gap*2+1, gap*2+1);
if(!flicker)
{
screengc.drawImage(buffer, 0, 0, null);
//通过drawImage方法向用户屏幕绘图,双缓冲实现
}
}
public void update(Graphics g)
{
//覆盖update方法可以更进一步的解决屏幕闪烁的问题
//因为update默认的方法是先用背景色将屏幕填充一遍之后再调用paint方法
paint(g);
}
}
书上的例子,供参考:
/*从Java2 complete reference中剽的一个关于双缓冲的例子
*用的是applet表现的
*基本原理:
*首先获得你的屏幕绘图区域的大小;
*进而在内存中开辟一个同样大小的缓冲区域
*将所有的绘图操作在内存中的缓冲中进行
*从而防止在屏幕进行绘图产生的闪烁
*覆盖update()方法从而防止用底色刷新屏幕时的闪烁
*/
import java.awt.*;
import java.awt.event.*;
import java.applet.*;/*
<applet code="DoubleBuffer" width=250 height=250>
</applet>
*/public class DoubleBuffer extends Applet
{
int gap = 3;
int mx, my;
boolean flicker = true;
Image buffer = null;
int w, h;
public void init()
{
Dimension d = getSize();
//获取用户屏幕的大小
w = d.width;
h = d.height;
buffer = createImage(w, h);
//以同样的大小在内存中开辟一块缓冲区,并将buffer指向它
addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent me)
{
mx = me.getX();
my = me.getY();
flicker = false;
repaint();
}
public void mouseMoved(MouseEvent me)
{
mx = me.getX();
my = me.getY();
flicker = true;
repaint();
}
});
}
public void paint(Graphics g)
{
Graphics screengc = null;
if(!flicker)
{
screengc = g;
g = buffer.getGraphics();
//将g指向缓冲区域
}
g.setColor(Color.blue);
g.fillRect(0, 0, w, h);
g.setColor(Color.red);
for(int i=0; i<w; i+=gap)
g.drawLine(i, 0, w-i, h);
for(int i=0; i<h; i+=gap)
g.drawLine(0, i, w, h-i);
g.setColor(Color.black);
g.drawString("Press mouse button to double buffer", 10, h/2);
g.setColor(Color.yellow);
g.fillOval(mx-gap, my-gap, gap*2+1, gap*2+1);
if(!flicker)
{
screengc.drawImage(buffer, 0, 0, null);
//通过drawImage方法向用户屏幕绘图,双缓冲实现
}
}
public void update(Graphics g)
{
//覆盖update方法可以更进一步的解决屏幕闪烁的问题
//因为update默认的方法是先用背景色将屏幕填充一遍之后再调用paint方法
paint(g);
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货