java双缓冲技术

最近想弄一个小小的程序练习和巩固自己的java基础,既然学习了awt,所以现在编的程序自然是有简单的界面的,不能老是停留在原始的黑乎乎的dos窗口了。最近的做的东西我一般都会用到drawString(String,int,int)方法,主要是我想将自己程序里面设置的某些变量的值写在窗体中,那样我自己也好看一下自己的这些变量是不是在看自己的意愿在执行,其实它就等同于某些同志喜欢将部分变量的值用system.out.println(“”);输出是一样的,只是对我来说有时不方便看console而已。

经常我们会看到drawString方法输出的值虽然在改变,但是我们真的看不太清它变成多少了。
我先截个图给大家看看
drawstring

这只是一个简单的例子程序,都容易出现这种状况的话,复杂的多变的图形界面程序怎么办,这是我们一般会用一个线程对该窗体来调用repaint(); 但是这同时也带来一个问题,那就是人的肉眼明显感觉到画面在闪烁,那这又该怎么办呢?现在我们今天说的主角就上场了,没错,我们得利用java的双缓冲技术了。
我把测试程序的源代码公布一下,欢迎大家探讨;
MyTestDoubleBuffering.java的源代码如下

import java.awt.*;
import java.awt.event.*;
import java.util.Random;
public class MyTestDoubleBuffering {
	public static void main(String[] args) {
		new TestFrame("测试双缓冲");
	}
}

class TestFrame extends Frame {
	Random r = null;
	Image offScreenImage =null;
	TestFrame(String name) {
		super(name);
		setSize(400,300);
		setLocation(300,200);
		setLayout(new BorderLayout());
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				setVisible(false);
				System.exit(0);
			}
			
		});
		Button c = new Button("Click");
		c.setSize(19, 19);
		c.addActionListener(new ActionListener(){

			public void actionPerformed(ActionEvent arg0) {
				test(getGraphics());
			}	
		});
		add(c,BorderLayout.SOUTH);
		setVisible(true);
		
		new Thread(new PaintThread()).start();
		
	}
	
	public void test(Graphics g) {
		r = new Random();
		g.drawString(r + "",100,200);
	}
	
	public void update(Graphics g) {
		if(offScreenImage == null){
			offScreenImage = this.createImage(400,300);
		}
		Graphics gOffScreen = offScreenImage.getGraphics();
		Color c = gOffScreen.getColor();
		gOffScreen.setColor(Color.white);
		gOffScreen.fillRect(0, 0, 400, 300);
		gOffScreen.setColor(c);
		paint(gOffScreen);
		g.drawImage(offScreenImage, 0, 0, null);
	}
	
	class PaintThread implements Runnable {
		public void run() {
			while (true) {
				repaint();
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注