Removing Windoze Flicker
<< Poker Demo | Applets | Loading Image Files From Your jar >>
The flicker problem on Windows machines can be removed by doing two things:
- draw the graphics off-screen
- make a update() method that explicitly calls paint:
public void update(Graphics g) { paint(g); }
To see the flicker, try removing the update() method and recompile on a windows machine
FlickerApplet.java
import java.applet.Applet; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Timer; public class FlickerApplet extends Applet implements ActionListener { public static final int WIDTH=400,HEIGHT=300; private int x, y; private Timer timer; private Image imgBuffer; private Graphics gBuffer; private Font font; /** * imgBuffer is the "off screen" graphics area * gBuffer is imgBuffer's graphics object * which we need to draw stuff on the image */ public void init() { imgBuffer = createImage(WIDTH,HEIGHT); gBuffer = imgBuffer.getGraphics(); //Here we make a timer event every 60 millisecs timer = new Timer(60,this); timer.start(); x = this.getWidth()/2; y = this.getHeight()/2; font = new Font("Helvetica", Font.BOLD, 18); } public void paint(Graphics g) { // draw components off screen on gBufffer gBuffer.setColor(Color.RED); gBuffer.fillRect(0, 0, WIDTH, HEIGHT); gBuffer.setColor(Color.BLACK); gBuffer.setFont(font); gBuffer.drawString("X = "+x, 20, 40); gBuffer.fillOval(x, y, 50, 50); // now we quickly swap the screen image with the one we made g.drawImage(imgBuffer,0,0,this); } /** * update is only needed for Microsoft Windows * to remove the famous "flicker problem" */ public void update(Graphics g) { paint(g); } /** * Here we implement the ActionLister interface. * Our time produced an action event over the * passage of time. So to animate our applet * we change the horizontal location of out Oval. */ @Override public void actionPerformed(ActionEvent e) { x+=3; x=x%(WIDTH-50); repaint(); } }