Question

My gif animation flickers too much. I've heard about double buffering that can help but how do I do that to my gif animation? Or is there a better faster shortcut to it. This is just a small test applet thing Im doing for fun but will implement the lessons in class.

Context:

import java.net.*;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.*;
public class HiroshimaBlock extends Applet implements ActionListener {

TextField distanceText = new TextField(10);
TextField accelerationText = new TextField(10);
Button security = new Button("Account Manager");
Button launch = new Button("LAUNCH!");
Button Reportl = new Button("Report Logs");
Image dancer;
URL base;
MediaTracker mt;
Timer tm = new Timer(10, this);

TextArea answers = new TextArea("I am ready for your first trip.", 4, 20,
        TextArea.SCROLLBARS_NONE);

Image image;

@Override
public void init() {
    setSize(550, 500);
    // Some messages for the top of the Applet:
    addHorizontalLine(Color.orange);

    addNewLine();
    // JOptionPane.showMessageDialog(null, "HiroshimaBlock",
    // "Welcome to HiroshimaBlock", JOptionPane.PLAIN_MESSAGE);
    // The two text fields and the launch button:
    Frame c = (Frame) this.getParent().getParent();
    c.setTitle("HiroshimaBlock");

    mt = new MediaTracker(this);
    try {
        base = getDocumentBase();
    } catch (Exception e) {
    }
    dancer = getImage(base, "dancer1.gif");
    mt.addImage(dancer, 9);
    try {
        mt.waitForAll();
    } catch (InterruptedException e) {
    }

    loadImage();
    // add(distanceText);
    // add(new Label("Distance of trip in light years"));
    addNewLine();
    addNewLine();
    // add(accelerationText);
    // add(new Label("Acceleration of rocket in g's"));
    addNewLine();
    add(launch);
    addNewLine();
    add(security);
    addNewLine();
    add(Reportl);

    // A text area for printing the answers:
    // answers.setEditable(false);
    // add(answers);
    addNewLine();
    addNewLine();
    addHorizontalLine(Color.orange);

}

public void loadImage() {

    URL url = getClass().getResource("hsblock.png");
    image = getToolkit().getImage(url);
}

public void paint(Graphics g) {
    g.drawImage(image, 20, 20, this);

    this.security.setLocation(25, 200);
    addNewLine();
    this.launch.setLocation(25, 230);
    this.Reportl.setLocation(25, 260);
    this.security.setSize(100, 25);
    this.launch.setSize(100, 25);
    this.Reportl.setSize(100, 25);

    g.drawImage(dancer, 150, 200, this);
    tm.start();
}

private void addHorizontalLine(Color c) {
    // Add a Canvas 10000 pixels wide but only 1 pixel high, which acts as
    // a horizontal line to separate one group of components from the next.
    Canvas line = new Canvas();
    line.setSize(10000, 1);
    line.setBackground(c);

    add(line);
}

private void addNewLine() {
    // Add a horizontal line in the background color. The line itself is
    // invisible, but it serves to force the next Component onto a new line.
    addHorizontalLine(getBackground());
}

@Override
public void actionPerformed(ActionEvent arg0) {
    // TODO Auto-generated method stub

}

    }
Was it helpful?

Solution 2

Well LOL I made it stop flickering by using update LOLOLOL

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends Applet {

Image img;

public void init() {
    setSize(700, 700);

    img = getImage(getDocumentBase(), "dancer1.gif");

}

public void update(Graphics g) {
    g.drawImage(img, 140, 200, this);
}

public void paint(Graphics g) {
    update(g);
}

}

OTHER TIPS

You want to:

  • Create a drawing class that extends JPanel (or JComponent)
  • Override the paintComponent(Graphics g) method of your class.
  • Call the super's method first in this method
  • And then do your animation drawing in this method.
  • This will give you Swing's automatic double buffering which should help smooth out your animation.
  • Display your drawing JPanel in your JApplet by adding it to the applet's contentPane.

For example:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;
import java.nio.Buffer;

import javax.swing.*;

public class SimpleAnimation extends JApplet {
   @Override
   public void init() {
      try {
         SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
               DrawPanel drawPanel = new DrawPanel();
               getContentPane().add(drawPanel);
            }
         });
      } catch (InvocationTargetException | InterruptedException e) {
         e.printStackTrace();
      }
   }
}

class DrawPanel extends JPanel {
   private static final int I_WIDTH = 20;
   private static final int I_HEIGHT = 20;
   private static final int TIMER_DELAY = 15;
   private int x = 0;
   private int y = 0;
   private BufferedImage img = new BufferedImage(I_WIDTH, I_HEIGHT, BufferedImage.TYPE_INT_ARGB);

   public DrawPanel() {
      Graphics2D g2 = img.createGraphics();
      g2.setColor(Color.red);
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
            RenderingHints.VALUE_ANTIALIAS_ON);
      g2.fillOval(1, 1, I_WIDTH - 2, I_HEIGHT - 2);
      g2.dispose();

      new Timer(TIMER_DELAY, new TimerListener()).start();
   }

   @Override
   protected void paintComponent(Graphics g) {
      super.paintComponent(g);
      if (img != null) {
         g.drawImage(img, x, y, this);
      }
   }

   private class TimerListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
         x++;
         y++;
         repaint();
      }
   }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top