优化前的代码:
package com; import javax.swing.*; import java.awt.*; /** * 使用Eclipse,右键Run As,Java Applet运行 * 优化前效果:出现画面抖动和白光效果 * @author 胡金水 * */ public class NoBufferMovingCircle extends JApplet implements Runnable { Image screenImage = null; Thread thread; int x = 5; int move = 1; public void init(){ screenImage = createImage(230,160); } public void start(){ if(thread == null){ thread = new Thread(this); thread.start(); } } @Override public void run() { try{ while (true){ x += move; if((x > 105) || (x < 5)){ move *= -1; } repaint(); Thread.sleep(10); } }catch (Exception e){ } } public void drawCircle(Graphics gc){ Graphics2D g = (Graphics2D) gc; g.setColor(Color.GREEN); g.fillRect(0,0,200,100); g.setColor(Color.red); g.fillOval(x,5,90,90); } public void paint(Graphics g){ g.setColor(Color.white); g.fillRect(0,0,200,100); drawCircle(g); } }
优化后的代码:
package com; import java.awt.Color; import java.awt.Graphics; /** * 使用Java Applet运行 * 优化后,没有出现画面抖动和白光效果 * @author 胡金水 * */ public class BufferMovingCircle extends NoBufferMovingCircle{ Graphics doubleBuffer = null;//缓冲区 public void init() { super.init(); doubleBuffer = screenImage.getGraphics(); } public void paint(Graphics g) {//使用缓冲区,优化原有的paint()方法 doubleBuffer.setColor(Color.white);//先在内存中画图 doubleBuffer.fillRect(0, 0, 200, 100); drawCircle(doubleBuffer); g.drawImage(screenImage, 0, 0, this);//将buffer一次性显示出来 } }