g如何用双缓冲解决java swing图像移动闪烁

来源:百度知道 编辑:UC知道 时间:2024/06/09 09:20:29
我写一个小球的移动,但是在移动过程图像会闪烁,但网上查到有双缓冲技术可以解决,但不知代码怎么写,请各位帮帮忙,谢谢了!
public class Test extends JFrame {
private static final long serialVersionUID = 1L;
private static int x = 100,y = 100;
public Test() {
setTitle("图片");

setSize(600, 600);

new t1().start();
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.red);
g.drawOval(x, y, 20, 20);
}

class t1 extends Thread {
public void run() {
do {
x+=1;
y+=1;
repaint();

try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while(x!=400 && y!=400);
}
}

public static void main(String[] args) {
new Test().setVisible(true);
}
}

双缓存:缓存区是绘图绘图时使用的屏外内存区。使用双缓存不是直接绘制屏幕,而是绘制到后缓存区,然后将整个缓存区复制到屏幕上,这样就可以同时更新整个屏幕,游戏者只看到要看到的东西了。后缓存区可能只是普通java图像。可以用Component类的createImage(int w,int h)方法生成后缓存区,如果是不使用活动绘制的小程序使用双缓存,则可以覆盖update()方法,改用双缓存,并用双缓存的图形描述表调用paint()方法,实现代码如下:

private Image doubleBuffer;
public void update(Graphics g){
Dimension size=getSize();
if(doubleBuffer.getWidth(this)!=size.width||doubleBuffer.getHeight(this)!=size.height)
{ doubleBuffer=createImage(size.width,size.height);
}
if(doubleBuffer!=null){
//绘制到双缓存区
Graphics g2=doubleBuffer.getGraphics();
paint(g2);
g2.dispose();
//将双缓存复制到屏幕
g.drawImage(doubleBuffer,0,0,null);
}
else
{//不要双缓存,只绘制屏幕
paint(g);
}
}
public void paint(Graphics g){
//在此绘图
}

先创建一个固定大小的画布
Image image = new Image(20,20);
获得画布的graphics对象,这里为第一层缓冲
Graphics g = image.getGraphics();
g.setColor(Color.red);
g.drawOval(0, 0, 20, 20);

public voi