Animated Gifs in Swing

Is it possible to draw an animated Gif in a swing gui? I know how I can display animated gifs in an applet, but I really would like to do it in a gui that does not use the class Applet.

Welcome to the Sun forums.
KarlStroetmann wrote:
Is it possible to draw an animated Gif in a swing gui? E.G.
import javax.swing.*;
import java.net.URL;
class ShowGif {
  public static void main(String[] args) throws Exception {
    final URL url = new URL(
      "http://pscode.org/media/starzoom-thumb.gif");
    Runnable r = new Runnable() {
      public void run() {
        ImageIcon ii = new ImageIcon(url);
        JOptionPane.showMessageDialog( null, ii );
    SwingUtilities.invokeLater(r);
KarlStroetmann wrote:.. I know how I can display animated gifs in an applet, but I really would like to do it in a gui that does not use the class Applet.A JApplet is Swing, and offers all the methods an Applet does. ;)
Edit 1:
Note that it is usually necessary to wrap an ImageIcon in a JLabel before display, but JOptionPane does that automatically.
Edited by: AndrewThompson64 on Jul 10, 2009 5:26 AM

Similar Messages

  • Disabled JMenuItem doesn show animated gif

    Hi there
    I would like to have a popup menu with actions that are enabled after they have finished with some background task taking some time. Basically this works fine for the enabling action on a shown popup. However, adding an animated gif as the icon or disabled icon does not show it in disabled state. In enabled state it works perfect. Please have a try with the sample code. You should see the disabled item for 2 secs and the icon is not showing up. After being enabled, it does. Invoking the menu again shows the animated gif in its last state left, but not moving any more.
    I guess, repaints are not done appropriately in disabled state... Any ideas how to solve that would be highly appreciated :-)
    Actually I used the icon at http://mentalized.net/activity-indicators/indicators/pascal_germroth/indicator.white.gif
    Cheers
    Daniel
    public class Main
      public static void main(String[] args)
        final JFrame frame = new JFrame();
        frame.addMouseListener(new MouseAdapter()
          public void mousePressed(final MouseEvent e)
            final JPopupMenu popup = new JPopupMenu();
            popup.add(new JMenuItem("Open..."));
            popup.add(new JMenuItem("Close"));
            final JMenuItem action = new JMenuItem("Long loading until enabled");
            action.setIcon(new ImageIcon("C:/spinner.gif"));
            action.setDisabledIcon(new ImageIcon("C:/spinner.gif"));
            popup.add(action).setEnabled(false);
            popup.show(e.getComponent(), e.getX(), e.getY());
            SwingUtilities.invokeLater(new Runnable()
              public void run()
                try
                  Thread.sleep(2000);
                  action.setEnabled(true);
                catch (InterruptedException e1)
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }Edited by: daniel.frey on Apr 22, 2009 7:50 AM

    The problem is that you are causing the EDT to sleep, which means the GUI can't repaint itself. Read the section from the Swing tutorial on Concurrency to understand what is happening.

  • Resized animated gif ImageIcon not working properly with JButton etc.

    The problem is that when I resize an ImageIcon representing an animated gif and place it on a Jbutton, JToggelButton or JLabel, in some cases the image does not show or does not animate. More precicely, depending on the specific image file, the image shows always, most of the time or sometimes. Images which are susceptible to not showing often do not animate when showing. Moving over or clicking with the mouse on the AbstractButton instance while the frame is supposed to updated causes the image to disappear (even when viewing the non-animating image that sometimes appears). No errors are thrown.
    Here some example code: (compiled with Java 6.0 compliance)
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class Test
         public static void main(String[] args)
              new Test();
         static final int  IMAGES        = 3;
         JButton[]           buttons       = new JButton[IMAGES];
         JButton             toggleButton  = new JButton("Toggle scaling");
         boolean            doScale       = true;
         public Test()
              JFrame f = new JFrame();
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              JPanel p = new JPanel(new GridLayout(1, IMAGES));
              for (int i = 0; i < IMAGES; i++)
                   p.add(this.buttons[i] = new JButton());
              f.add(p, BorderLayout.CENTER);
              f.add(this.toggleButton, BorderLayout.SOUTH);
              this.toggleButton.addActionListener(new ActionListener() {
                   @Override
                   public void actionPerformed(ActionEvent e)
                        Test.this.refresh();
              f.setSize(600, 300);
              f.setVisible(true);
              this.refresh();
         public void refresh()
              this.doScale = !this.doScale;
              for (int i = 0; i < IMAGES; i++)
                   ImageIcon image = new ImageIcon(i + ".gif");
                   if (this.doScale)
                        image = new ImageIcon(image.getImage().getScaledInstance(180, 180, Image.SCALE_AREA_AVERAGING));
                   image.setImageObserver(this.buttons);
                   this.buttons[i].setIcon(image);
                   this.buttons[i].setSelectedIcon(image);
                   this.buttons[i].setDisabledIcon(image);
                   this.buttons[i].setDisabledSelectedIcon(image);
                   this.buttons[i].setRolloverIcon(image);
                   this.buttons[i].setRolloverSelectedIcon(image);
                   this.buttons[i].setPressedIcon(image);
    Download the gif images here:
    http://djmadz.com/zombie/0.gif
    http://djmadz.com/zombie/1.gif
    http://djmadz.com/zombie/2.gif
    When you press the "Toggle scaling"button it switches between unresized (properly working) and resized instances of three of my gif images. Notice that the left image almost never appears, the middle image always, and the right image most of the time. The right image seems to (almost) never animate. When you click on the left image (when visble) it disappears only when the backend is updating the animation (between those two frames with a long delay)
    Why are the original ImageIcon and the resized ImageIcon behaving differently? Are they differently organized internally?
    Is there any chance my way of resizing might be wrong?

    It does work, however I refuse to use SCALE_REPLICATE for my application because resizing images is butt ugly, whether scaling up or down. Could there be a clue in the rescaling implementations, which I can override?
    Maybe is there a way that I can check if an image is a multi-frame animation and set the scaling algorithm accordingly?
    Message was edited by:
    Zom-B

  • Create animated GIF using imageio

    How do you create an animated GIF using the J2SE's javax.imageio classes?
    I have been browsing these 3 threads (one of which I participated in) to try and develop an SSCCE of creating an animated GIF.
    [Writing out animated gifs with ImageIO?|http://forums.sun.com/thread.jspa?threadID=5204877]
    [Wirting image metadata to control animated gif delays |http://forums.java.net/jive/thread.jspa?messageID=214284&]
    [Help with GIF writer in imageio|http://www.javakb.com/Uwe/Forum.aspx/java-programmer/32892/Help-with-GIF-writer-in-imageio]
    (pity I did not prompt the OP on that last one, to supply an SSCCE.)
    Unfortunately, my efforts so far have been dismal. Either, without the IIOMetadata object, the GIF has frames with no delay, and it cycles just once, or with the IIOMetadata object I get an error.
    IIOInvalidTreeException: Unknown child of root node!Can anyone point me in the right direction?
    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
    import java.io.*;
    import java.net.URL;
    import java.util.Iterator;
    import javax.imageio.*;
    import javax.imageio.metadata.*;
    import javax.imageio.stream.*;
    import org.w3c.dom.Node;
    class WriteAnimatedGif {
      /** Adapted from code via Brian Burkhalter on
      http://forums.java.net/jive/thread.jspa?messageID=214284& */
      public static Node getRootNode(String delayTime) {
        IIOMetadataNode root =
          new IIOMetadataNode("javax_imageio_gif_stream_1.0");
        IIOMetadataNode gce =
          new IIOMetadataNode("GraphicControlExtension");
        gce.setAttribute("disposalMethod", "none");
        gce.setAttribute("userInputFlag", "FALSE");
        gce.setAttribute("transparentColorFlag", "FALSE");
        gce.setAttribute("delayTime", delayTime);
        gce.setAttribute("transparentColorIndex", "255");
        root.appendChild(gce);
        IIOMetadataNode aes =
          new IIOMetadataNode("ApplicationExtensions");
        IIOMetadataNode ae =
          new IIOMetadataNode("ApplicationExtension");
        ae.setAttribute("applicationID", "NETSCAPE");
        ae.setAttribute("authenticationCode", "2.0");
        byte[] uo = new byte[] {
          (byte)0x21, (byte)0xff, (byte)0x0b,
          (byte)'N', (byte)'E', (byte)'T', (byte)'S',
          (byte)'C', (byte)'A', (byte)'P', (byte)'E',
          (byte)'2', (byte)'.', (byte)'0',
          (byte)0x03, (byte)0x01, (byte)0x00, (byte)0x00,
          (byte)0x00
        ae.setUserObject(uo);
        aes.appendChild(ae);
        root.appendChild(aes);
        return root;
      /** Adapted from code via GeogffTitmus on
      http://forums.sun.com/thread.jspa?messageID=9988198 */
      public static File saveAnimate(
        BufferedImage[] frames,
        String name,
        String delayTime) throws Exception {
        File file = null;
        file = new File(name+".gif");
        Node root = getRootNode(delayTime);
        ImageWriter iw = ImageIO.getImageWritersByFormatName("gif").next();
        ImageOutputStream ios = ImageIO.createImageOutputStream(file);
        iw.setOutput(ios);
        //IIOImage ii = new IIOImage(frames[0], null, null);
        //IIOMetadata im = iw.getDefaultStreamMetadata(null);
        //IIOMetadata im = new AnimatedIIOMetadata();
        //im.setFromTree("gif", root);
        iw.prepareWriteSequence(null);
        for (int i = 0; i < frames.length; i++) {
          BufferedImage src = frames;
    ImageWriteParam iwp = iw.getDefaultWriteParam();
    IIOMetadata metadata = iw.getDefaultStreamMetadata(iwp);
    System.out.println( "IIOMetadata: " + metadata );
    //metadata.mergeTree(metadata.getNativeMetadataFormatName(), root);
    metadata.setFromTree(metadata.getNativeMetadataFormatName(), root);
    //Node root = metadata.getAsTree("javax_imageio_gif_image_1.0");
    IIOImage ii = new IIOImage(src, null, metadata);
    iw.writeToSequence( ii, (ImageWriteParam)null);
    iw.endWriteSequence();
    ios.close();
    return file;
    public static void main(String[] args) throws Exception {
    // uncomment the other two if you like, but we can
    // see it work or fail with just the first and last.
    String[] names = {
    "bronze",
    //"silver",
    //"gold",
    "platinum"
    String pre = "http://forums.sun.com/im/";
    String suff = "-star.gif";
    BufferedImage[] frames = new BufferedImage[names.length];
    for (int ii=0; ii<names.length; ii++) {
    URL url = new URL(pre + names[ii] + suff);
    System.out.println(url);
    frames[ii] = ImageIO.read(url);
    File f = saveAnimate(frames, "animatedstars", "500");
    JOptionPane.showMessageDialog( null, new ImageIcon(f.toURI().toURL()) );
    Desktop.getDesktop().open(f);
    ImageInputStream iis = ImageIO.createImageInputStream(f);
    //System.out.println("ImageReader: " + ir1);
    //System.out.println("IIOMetadata: " + ir1.getStreamMetadata());
    Iterator itReaders = ImageIO.getImageReaders(iis);
    while (itReaders.hasNext() ) {
    ImageReader ir = (ImageReader)itReaders.next();
    System.out.println("ImageReader: " + ir);
    System.out.println("IIOMetadata: " + ir.getStreamMetadata());

    According to imagio's [gif metadata specification|http://java.sun.com/javase/6/docs/api/javax/imageio/metadata/doc-files/gif_metadata.html], the metadata you are specifying is image-specific metadata. The stream metadata is global metadata applicable to all the images.
    So change this,
    IIOMetadataNode root =
        new IIOMetadataNode("javax_imageio_gif_stream_1.0");to this,
    IIOMetadataNode root =
        new IIOMetadataNode("javax_imageio_gif_image_1.0");and this,
    IIOMetadata metadata = iw.getDefaultStreamMetadata(iwp);
    System.out.println( "IIOMetadata: " + metadata );
    //metadata.mergeTree(metadata.getNativeMetadataFormatName(), root);
    metadata.setFromTree(metadata.getNativeMetadataFormatName(), root);
    //Node root = metadata.getAsTree("javax_imageio_gif_image_1.0");to this,
    IIOMetadata metadata = iw.getDefaultImageMetadata(
            new ImageTypeSpecifier(src),null);
    System.out.println("IIOMetadata: " + metadata);
    metadata.mergeTree(metadata.getNativeMetadataFormatName(), root);Here is your program again, but with the above changes.
    import java.awt.*;
    import java.awt.image.*;
    import javax.swing.*;
    import java.io.*;
    import java.net.URL;
    import java.util.Iterator;
    import javax.imageio.*;
    import javax.imageio.metadata.*;
    import javax.imageio.stream.*;
    import org.w3c.dom.Node;
    class WriteAnimatedGif {
        /** Adapted from code via Brian Burkhalter on
        http://forums.java.net/jive/thread.jspa?messageID=214284& */
        public static Node getRootNode(String delayTime) {
            IIOMetadataNode root =
                    new IIOMetadataNode("javax_imageio_gif_image_1.0");
            IIOMetadataNode gce =
                    new IIOMetadataNode("GraphicControlExtension");
            gce.setAttribute("disposalMethod", "none");
            gce.setAttribute("userInputFlag", "FALSE");
            gce.setAttribute("transparentColorFlag", "FALSE");
            gce.setAttribute("delayTime", delayTime);
            gce.setAttribute("transparentColorIndex", "255");
            root.appendChild(gce);
            IIOMetadataNode aes =
                    new IIOMetadataNode("ApplicationExtensions");
            IIOMetadataNode ae =
                    new IIOMetadataNode("ApplicationExtension");
            ae.setAttribute("applicationID", "NETSCAPE");
            ae.setAttribute("authenticationCode", "2.0");
            byte[] uo = new byte[]{
                (byte) 0x21, (byte) 0xff, (byte) 0x0b,
                (byte) 'N', (byte) 'E', (byte) 'T', (byte) 'S',
                (byte) 'C', (byte) 'A', (byte) 'P', (byte) 'E',
                (byte) '2', (byte) '.', (byte) '0',
                (byte) 0x03, (byte) 0x01, (byte) 0x00, (byte) 0x00,
                (byte) 0x00
            ae.setUserObject(uo);
            aes.appendChild(ae);
            root.appendChild(aes);
            return root;
        /** Adapted from code via GeogffTitmus on
        http://forums.sun.com/thread.jspa?messageID=9988198 */
        public static File saveAnimate(
                BufferedImage[] frames,
                String name,
                String delayTime) throws Exception {
            File file = null;
            file = new File(name + ".gif");
            Node root = getRootNode(delayTime);
            ImageWriter iw = ImageIO.getImageWritersByFormatName("gif").next();
            ImageOutputStream ios = ImageIO.createImageOutputStream(file);
            iw.setOutput(ios);
            //IIOImage ii = new IIOImage(frames[0], null, null);
            //IIOMetadata im = iw.getDefaultStreamMetadata(null);
            //IIOMetadata im = new AnimatedIIOMetadata();
            //im.setFromTree("gif", root);
            iw.prepareWriteSequence(null);
            for (int i = 0; i < frames.length; i++) {
                BufferedImage src = frames;
    ImageWriteParam iwp = iw.getDefaultWriteParam();
    IIOMetadata metadata = iw.getDefaultImageMetadata(
    new ImageTypeSpecifier(src), null);
    System.out.println("IIOMetadata: " + metadata);
    metadata.mergeTree(metadata.getNativeMetadataFormatName(), root);
    IIOImage ii = new IIOImage(src, null, metadata);
    iw.writeToSequence(ii, (ImageWriteParam) null);
    iw.endWriteSequence();
    ios.close();
    return file;
    public static void main(String[] args) throws Exception {
    // uncomment the other two if you like, but we can
    // see it work or fail with just the first and last.
    String[] names = {
    "bronze",
    //"silver",
    //"gold",
    "platinum"
    String pre = "http://forums.sun.com/im/";
    String suff = "-star.gif";
    BufferedImage[] frames = new BufferedImage[names.length];
    for (int ii = 0; ii < names.length; ii++) {
    URL url = new URL(pre + names[ii] + suff);
    System.out.println(url);
    frames[ii] = ImageIO.read(url);
    File f = saveAnimate(frames, "animatedstars", "500");
    JOptionPane.showMessageDialog(null, new ImageIcon(f.toURI().toURL()));
    Desktop.getDesktop().open(f);
    ImageInputStream iis = ImageIO.createImageInputStream(f);
    //System.out.println("ImageReader: " + ir1);
    //System.out.println("IIOMetadata: " + ir1.getStreamMetadata());
    Iterator itReaders = ImageIO.getImageReaders(iis);
    while (itReaders.hasNext()) {
    ImageReader ir = (ImageReader) itReaders.next();
    System.out.println("ImageReader: " + ir);
    System.out.println("IIOMetadata: " + ir.getStreamMetadata());

  • Animated .gif won't loop a specified amount of times

    I created an animated .gif in photoshop and set it to loop twice. It works fine in every other browser except firefox. Here is a test example:
    http://elliottkirby.com/test/
    The box is set to animate across twice. Any thoughts? I tested setting it to loop "forever" and it works in FF...however the ad I'm creating has a loop time limit. I checked my config settings and image animation is set to normal. Thanks!

    From what I understand of your problem;
    - You have made your own animated gifs
    - With the software to make these gifs you have set them to loop their animations 3 times
    - They loop continuously
    I don't see how java can be expected to interpret the animated gif software instructions to loop only 3 times and would assume that there are various proprietry ways of setting this (an assumption based on applets /javascript etc, that rely on the client-side browser interpreter). So, if you loop your animated gif or have any form of animated gif that you import into your program with getDocumentBase /getCodeBase as a (pre-animated) gif, then this is exactly what I would assume would happen.
    The answer is to seperate your images with eg;-
    smiley1[0];
    smiley1[1];
    smiley1[2];
    run a seperate thread, cycle through them as you wish and stop.
    I'm fairly sure that there is nothing in either the swing libraries or the jmf libraries that can resolve this any other way, so your choices are write extra code and have a pool of threads to control this, or leave it as is.

  • Animated gif flickering

    animated gif images are flickering:
            final ImageView imgView = new ImageView();
            final Image tempImg = new Image(getClass().getResource("logo1.gif").toExternalForm());
            imgView.setImage(tempImg);
            imgView.setLayoutX(50);
            imgView.setLayoutY(50);
            root.getChildren().add(imgView);
            primaryStage.setScene(scene);
            primaryStage.show();few gif images works fine...most of the images dances here and there
    eg: http://www.nonstopgifs.com/animated-gifs/games/games-animated-gif-002.gif
    how to avoid this flickering
    some images wrks fine in SWING .. which flickers in JavaFX 2.0
    please help
    Edited by: Vj on Feb 21, 2012 3:03 PM

    the url you had given is forbidden to me.JavaFX has an open issue tracking system.
    When you go to the link http://javafx-jira.kenai.com , click on Sign Up for an account and you can file a bug.
    https://forums.oracle.com/forums/ann.jspa?annID=1713
    Could you do me a favor to file this bug to the JavaFx development team?Sorry, it does not make sense for me to file a bug without the actual GIF images which are causing issues.
    Please go to the JavaFX issue tracker and file a bug with sample GIF images so that the person investigating the issue is able to replicate and debug it.
    Thanks, John

  • Animated Gif Repaint

    I knew I was going to end up here eventually, stupid animated gifs.
    First of all, I get weird drawing artifacts on an animated gif on jkd 1.5, I upped this to 1.6 and everything is cool with displaying the gif. It could be because I'm running JBuilder in a XP VM. I don't really care how to fix this, or if its even fixable, I'm just pointing it out.
    I have an animated gif in an imageicon. The program is hangman, and the gif shows a stick figure walking up onto the podium to get hung. I would like to play the gif once, every time the "New Game" button is clicked. I have tried a variety of things to do so, including JLabel1.repaint(); calling the label again, etc, etc. I'll try to post the relevant bits of my code.
    public class HangFrame
        extends JFrame implements ActionListener {
      public HangFrame()
        try {
          jbInit();
        catch (Exception ex) {
          ex.printStackTrace();
      }jbinit calls the placement of all the items.
        jLabel1.setBounds(new Rectangle(19, 57, 550, 400));
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == start) {
          start();
    ....'start' is my name for the button that reads "New Game".
    The start method contains:
    ImageIcon maingif = new ImageIcon( (ClassLoader.getSystemResource(
            "hang1.gif")));
         jLabel1.setIcon(maingif);
    //I've been trying different stuff right here, like repaint.The image displays correctly, and runs once (per the setting I gave it in flash, or thats how java does it).
    I've searched extensively (seems I got lucky by just managing to get it to display once :D). I saw that I might have to flush the image or something like that, but I'm not really sure what that means. I've never had any experience with the graphics and paint component, most of the work we do in class is console and algorithm stuff. I got bored over break and made my hangman into a swing app. I'd appreciate any help.
    Oh, and sorry if this should be in the swing subforum, I figured my issue was too basic for it.
    Edited by: rpk5000 on Dec 31, 2007 8:52 AM

    rpk5000 wrote:
    This is where you're wrong. Dipshits like you post **** like this all the time when it's readily available information that can be searched for WITHOUT >hosing up our forums.Great, give me a link, or even a search term to use on google or these forums. Before you give me search terms, you might want to actually check and make sure the answer is somewhere there...are you out of your freakin mind?!?!?!
    go to google and type "java gif animation"
    you think you're the first person to want to do this?!?!
    moreover, search the forums here
    you think you're the first person to ask for this here?!?!
    You would think "repainting an imageicon animated gif java" would give a page that has the answer on it within the first 10 results but....
    I'm looking for a page that simply says, take your imageicon and call.... (repaint();) or whatever to make it run one more time.Did you even read the API for ImageIcon! It took me 2 seconds to find the information for animating gifs as imageicons.
    Well Java just sucks now doesn't it. Stop using animated gifs and Java since they suck. There, problem solved!I like Java a lot, I'm just saying, in certain instances it seems to fall short.No, YOU fall short. I found the solution in 3 seconds.
    This is a "New to Java" subforum, if you can't handle helping people in a pleasant manner, that shows you respect the other person, what do you think people will think of you and java. If I spent more time on forums like this, and was looking at which language to try, I doubt I would pick java.I don't care what you think of me OR Java. I'm tired of noobs wasting forum resources with this crap. Once I was new to everything, but I went to the library and when the internet came along i learned how to search it!
    Critical thinking people. Don't we teach this in schools any more?!
    When it becomes an Internet joke (http://thedailywtf.com/Articles/plz-email-me-teh-codez.aspx) about how bad the sun forums are, well, you really need to reconsider what you want to do with your life.
    LMAO! You are the daily WTF!
    Edited by: wpafbuser1 on Dec 31, 2007 1:52 PM

  • Animated Gif won't stop looping!

    I'll try to format my question as best I can.
    I have created a Java chat applet, and for the Java chat, I have created a "ChatPane" class for displaying the chat. ChatPane is an extension of Canvas, and every time the paint() method is called, the program loops through visible lines of text drawing them on a buffer image, then draws the buffer on the screen.
    My problem lies in animated gifs. In my chatroom, chatters can type textual symbols that will be replaced with an image (or emoticon). I have created my animated icons in a popular animated gif editing program, and I have set particular icons to loop 3 times. The problem is that when the animated icon is displayed in my applet, the animation -doesn't stop- after 3 loops, it loops forever! I can't for the life of me figure out why! Can anyone provide any insight as to why the animations won't stop after 3 loops? The animations work just fine if displayed in a browser by themselves (they stop looping after 3 times)
    Thank you for any help!
    [email protected]
    Tony N.

    From what I understand of your problem;
    - You have made your own animated gifs
    - With the software to make these gifs you have set them to loop their animations 3 times
    - They loop continuously
    I don't see how java can be expected to interpret the animated gif software instructions to loop only 3 times and would assume that there are various proprietry ways of setting this (an assumption based on applets /javascript etc, that rely on the client-side browser interpreter). So, if you loop your animated gif or have any form of animated gif that you import into your program with getDocumentBase /getCodeBase as a (pre-animated) gif, then this is exactly what I would assume would happen.
    The answer is to seperate your images with eg;-
    smiley1[0];
    smiley1[1];
    smiley1[2];
    run a seperate thread, cycle through them as you wish and stop.
    I'm fairly sure that there is nothing in either the swing libraries or the jmf libraries that can resolve this any other way, so your choices are write extra code and have a pool of threads to control this, or leave it as is.

  • Animated gif resizing problem

    Im trying to achieve the following: showing an animated gif that resizes to fill the area of a canvas. I tried the easy way: adding a label and setting the icon for that label, but when trying to resize the image it doesnt show (see code below). Is there any particular way of resizing an animated gif? can the labe-icon approach be used with animated gif that must be resized?
    Thanks a lot in advance.
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Image;
    import javax.swing.ImageIcon;
    public class TestFrame extends javax.swing.JFrame {
    /** Creates new form TestFrame */
    public TestFrame() {
    initComponents();
    Image image = this.getToolkit().getImage("C:\\multivideo\\img\\39.gif");
    Dimension dim = jLabel1.getPreferredSize();
    image = image.getScaledInstance(dim.width, dim.height, Image.SCALE_SMOOTH);
    ImageIcon i = new ImageIcon(image);
    jLabel1.setIcon(i);
    jLabel1.setBackground(Color.BLUE);
    pack();
    /** This method is called from within the constructor to
    * initialize the form.
    private void initComponents()
    jLabel1 = new javax.swing.JLabel();
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
    jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
    jLabel1.setIcon(new javax.swing.ImageIcon("C:\\multivideo\\img\\40.gif"));
    jLabel1.setMaximumSize(new java.awt.Dimension(1436, 86));
    jLabel1.setMinimumSize(new java.awt.Dimension(1436, 86));
    jLabel1.setPreferredSize(new java.awt.Dimension(1436, 86));
    getContentPane().add(jLabel1, java.awt.BorderLayout.CENTER);
    pack();
    * @param args the command line arguments
    public static void main(String args[]) {
    java.awt.EventQueue.invokeLater(new Runnable() {
    public void run() {
    new TestFrame().setVisible(true);
    private javax.swing.JLabel jLabel1;
    }

    I don't think getScaledInstance is smart enough to return a scaled image.
    You could try doing your own scaling:
    import java.awt.*;
    import java.awt.geom.*;
    import java.net.*;
    import javax.swing.*;
    public class Animated extends JComponent {
        private Image image;
        private double scale;
        public Animated(URL url, double scale) {
            image = new ImageIcon(url).getImage();
            this.scale = scale;
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Insets insets = getInsets();
            Graphics2D g2 = (Graphics2D) g.create();
            g2.translate(insets.left, insets.top);
            g2.scale(scale, scale);
            g2.drawImage(image, 0, 0, this);
            g2.dispose();
        public Dimension getPreferredSize() {
            Insets insets = getInsets();
            int w = insets.left + insets.right + (int)(scale*image.getWidth(null));
            int h = insets.top + insets.bottom + (int)(scale*image.getHeight(null));
            return new Dimension(w,h);
        public static void main(String[] args) throws MalformedURLException {
            URL url = new URL("http://members.aol.com/royalef/sunglass.gif");
            final JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.getContentPane().add(new Animated(url, 2), BorderLayout.NORTH);
            f.getContentPane().add(new Animated(url, 1), BorderLayout.SOUTH);
            f.pack();
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    f.setLocationRelativeTo(null);
                    f.setVisible(true);
    }Or you could explicitly extract the images from the animated gif and
    resize them individually. The sample code here does the extraction:
    http://forum.java.sun.com/thread.jspa?forumID=20&threadID=500348

  • Problems playing animated gif on label again

    I have program that is displaying a graphic representation of a wave file this is a cut down of it. I am using a mouse listener to detect the mouse wheel and from that I am zooming in on the wave graphic or zooming out.
    The problem is when I zoom in a Jlabel is displayed with an animated gif saying �zooming in� that work fine. But as soon as I zoom in again, the Jlabel will not display the image again or the zooming out image.
    I an new to java so be kind to my code
    Any help would be greatly appreciated
    CODE
    * DisWav1.java
    * Created on 30 April 2006, 14:43
    import java.awt.BasicStroke;
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.Line2D;
    import java.util.Vector;
    import javax.swing.JPanel;
    import javax.swing.JDialog;
    public class DisWav1 extends JDialog implements Runnable{
    // varables
         private Thread thread;
         public static final int MAX_PRIORITY = 10;
         Vector lines = new Vector();
         Color jfcBlue = new Color(204, 204, 255);
    Color pink = new Color(255, 175, 175);
    private Font font12 = new Font("serif", Font.PLAIN, 12);
    long mainSize = 36000;
    int holdingArray[];
    int ZOOMFactor;
         private JPanel jContentPane = null;
         * This is the default constructor
         public DisWav1() {
              super();
              initialize();
         * This method initializes this
         * @return void
         private void initialize() {
              this.setBackground(java.awt.Color.black);
              this.setContentPane(getJContentPane());
              this.setTitle("Display Wave");
    this.setSize(150,150);
    addMouseWheelListener(new java.awt.event.MouseWheelListener() {
    public void mouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
    formMouseWheelMoved(evt);
         * This method initializes jContentPane
         * @return javax.swing.JPanel
         private JPanel getJContentPane() {
              if (jContentPane == null) {
                   jContentPane = new JPanel();
                   jContentPane.setBackground(java.awt.Color.black);
                   jContentPane.setLayout(new BorderLayout());
              return jContentPane;
         public void run()
    }// end run
    public void start() {
    thread = new Thread(this);
    thread.setName("Display Graph");
    thread.setPriority(MAX_PRIORITY );
    thread.start();
    }// end start
    public void stop() {
    if (thread != null) {
    thread.interrupt();
    thread = null;
    }// end stop
    // Create a array for drawing ines on screen in scale.
    public void moveMe(int x, int y){
    this.setLocation(x,y);
    // used to detect when the mouse is wheel is move and then
    // zoom IN or OUT
    // also display jLabel with animated gif saying "zooming in" or "Zooming out"
    private void formMouseWheelMoved(java.awt.event.MouseWheelEvent evt) {
    javax.swing.JLabel zz;
    zz = new javax.swing.JLabel();
    zz.setBounds(this.getWidth()/2, this.getHeight()/2, 140,40);
    zz.setText("");
    getContentPane().add(zz);
    int notches = evt.getWheelRotation();
    if (notches < 0) {
    getContentPane().add(zz);
    zz.setIcon(new javax.swing.ImageIcon("zoomingin.gif"));
    zz.setBounds(this.getWidth()/2-(zz.getWidth()/2), this.getHeight()/2-(zz.getHeight()/2), 140,40);
    System.out.println("zoom up " + ZOOMFactor);
    ZOOMFactor = ZOOMFactor +2;
    } else {
    if (ZOOMFactor <= 0 )
         ZOOMFactor = 1;
    else{
    getContentPane().add(zz);
    zz.setIcon(new javax.swing.ImageIcon("C:zoomingOUT.gif"));
    zz.setBounds(this.getWidth()/2-(zz.getWidth()/2), this.getHeight()/2-(zz.getHeight()/2), 140,40);
    ZOOMFactor = ZOOMFactor - 2;
    System.out.println("zoom down " + ZOOMFactor);
    public void paint(Graphics g) {
    // paints lines form a vector here on the screen
    }// end of paint method
    }// end class disWav1
    // END CODE

    think ive solved it

  • Animated GIF image gets distorted while playing.

    Hi,
    I have some animated gif images which I need to show in a jLabel and a jTextPane. But some of these images are getting distorted while playing in the two components, though these images are playing properly in Internet Explorer. I am using the methods insertIcon() of jTextPane and setIcon() of jLabel to add or set the gif images in the two components. Can you please suggest any suitable idea of how I can get rid of this distortion? Thanks in advance.

    In the code below is a self contained JComponent that paints a series of BufferedImages as an animation. You can pause the animation, and you specify the delay. It also has two static methods for loading all the frames from a File or a URL.
    Feel free to add functionality to it, like the ability to display text or manipulate the animation. You may wan't the class to extend JLabel instead of JComponent. Just explore around with the painting. If you have any questions, then feel free to post.
    The downside to working with an array of BufferedImages, though, is that they consume more memory then a single Toolkit gif image.
    import javax.swing.JComponent;
    import java.awt.image.BufferedImage;
    import java.awt.Graphics;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageReader;
    import javax.imageio.stream.ImageInputStream;
    public class JAnimationLabel extends JComponent {
        /**The default animation delay.  100 milliseconds*/
        public static final int DEFAULT_DELAY = 100;
        private BufferedImage[] images;
        private int currentIndex;
        private int delay;
        private boolean paused;
        private boolean exited;
        private final Object lock = new Object();
        //the maximum image width and height in the image array
        private int maxWidth;
        private int maxHeight;
        public JAnimationLabel(BufferedImage[] animation) {
            if(animation == null)
                throw new NullPointerException("null animation!");
            for(BufferedImage frame : animation)
                if(frame == null)
                    throw new NullPointerException("null frame in animation!");
            images = animation;
            delay = DEFAULT_DELAY;
            paused = false;
            for(BufferedImage frame : animation) {
                maxWidth = Math.max(maxWidth,frame.getWidth());
                maxHeight = Math.max(maxHeight,frame.getHeight());
            setPreferredSize(new java.awt.Dimension(maxWidth,maxHeight));
        //This method is called when a component is connected to a native
        //resource.  It is an indication that we can now start painting.
        public void addNotify() {
            super.addNotify();
            //Make anonymous thread run animation loop.  Alternative
            //would be to make the AnimationLabel class extend Runnable,
            //but this would allow innapropriate use.
            exited = false;
            Thread runner = new Thread(new Runnable() {
                public void run() {
                    runAnimation();
            runner.setDaemon(true);
            runner.start();
        public void removeNotify() {
            exited = true;
            super.removeNotify();
        /**Returns the animation delay in milliseconds.*/
        public int getDelay() {return delay;}
        /**Sets the animation delay between two
         * consecutive frames in milliseconds.*/
        public void setDelay(int delay) {this.delay = delay;}
        /**Returns whether the animation is currently paused.*/
        public boolean isPaused() {
            return exited?true:paused;}
        /**Makes the animation paused or resumes the painting.*/
        public void setPaused(boolean paused) {
            synchronized(lock) {
                this.paused = paused;
                lock.notify();
        private void runAnimation() {
            while(!exited) {
                repaint();
                if(delay > 0) {
                    try{Thread.sleep(delay);}
                    catch(InterruptedException e) {
                        System.err.println("Animation Sleep interupted");
                synchronized(lock) {
                    while(paused) {
                        try{lock.wait();}
                        catch(InterruptedException e) {}
        public void paintComponent(Graphics g) {
            if(g == null) return;
            java.awt.Rectangle bounds = g.getClipBounds();
            //center image on label
            int x = (getWidth()-maxWidth)/2;
            int y = (getHeight()-maxHeight)/2;
            g.drawImage(images[currentIndex], x, y,this);
            if(bounds.x == 0 && bounds.y == 0 &&
               bounds.width == getWidth() && bounds.height == getHeight()) {
                 //increment frame for the next time around if the bounds on
                 //the graphics object represents a full repaint
                 currentIndex = (currentIndex+1)%images.length;
            }else {
                //if partial repaint then we do not need to
                //increment to the the next frame
    }

  • Animated gif moving to fast

    I am trying to display an animated gif in a JLabel. My problem is that for some reason the animated gif speeds through the frames, instead of moving at the speed it was created at. Any idea what might be causing it.
    Below is the code I'm using to display the animated gif.
    import java.awt.*;
    import javax.swing.*;
    import javax.swing.JDialog;
    import java.io.*;
    public class loadingScreen extends JDialog
         private JLabel loadingLabel;
         ImageIcon loadIcon = new ImageIcon("images/animated_loading.gif");
        This function makes the loadingScreen a dialog box which, when
        opened, limits the user to be only able to use this window until
        they close it.
         public boolean startLoadingScreen()
              Window owner = (Window) getParent();
              Dimension d = getSize();
              Rectangle r = owner.getBounds();
              int x = r.x + r.width/2;
              int y = r.y + r.height/2;
              setBounds(x, y, d.width, d.height);
              getCenter();
              setVisible(true);
              return true;
        This function is called by an outside program. It takes in the owner
        frame information. It takes in a string that will be the title of
        the dialog box.
         public loadingScreen(Frame owner,String title,boolean modality)     
              super(owner, title, modality);          
              displayWindow();
        This function makes the gui for the window
         public void displayWindow()
              setResizable(false);
              Box groupBox = Box.createVerticalBox();
              loadingLabel = new JLabel(loadIcon);
              groupBox.add(loadingLabel);
              Container dialogPane = getContentPane();
              dialogPane.setLayout( new FlowLayout() );
              dialogPane.add(groupBox);
              pack();
         private void getCenter()
              Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();
              Rectangle frame = getBounds();
              setLocation((screen.width - frame.width)/2,(screen.height - frame.height)/2);
    }

    Thanks for the help. Once I editied the gif file everything worked fine. As a side note, I used Gimp to edit the file and when I tried saving it had a funny message. "Delay inserted to prevent evil CPU-sucking anim."
    Thanks for the help.
    Ricky

  • Animated .gif in JTable cell

    Hi -
    I have an actual animated .gif that I would like to display in a JTable's cell. By 'actual animated .gif', I mean that it is one file that is animated, and not a succession of files that I would loop through to look like animation.
    I have edited the following code that I found in a previous post. My .gif does display in the JTable and animates only ONCE. Once it animates once, it stops. How can I cause it to keep looping through and repeating the animation?
    Thanks!
    Kelly
    Code below:
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import javax.swing.*;
    import javax.swing.table.*;
    public class AnimatedIconTableExample extends JFrame
    public AnimatedIconTableExample()
    super("AnimatedIconTable Example");
    final Object[][] data = new Object[][]
    { new ImageIcon("images/Upload.gif") }
    final Object[] column = new Object[]
    { "Image Uploading" };
    AbstractTableModel model = new AbstractTableModel()
    public int getColumnCount()
    return column.length;
    public int getRowCount()
    return data.length;
    public String getColumnName(int col)
    return (String) column[col];
    public Object getValueAt(int row, int col)
    return data[row][col];
    public Class getColumnClass(int col)
    return ImageIcon.class;
    JTable table = new JTable(model);
    table.setRowHeight(50);
    setImageObserver(table);
    JScrollPane pane = new JScrollPane(table);
    getContentPane().add(pane);
    private void setImageObserver(JTable table)
    TableModel model = table.getModel();
    int colCount = model.getColumnCount();
    int rowCount = model.getRowCount();
    for (int col = 0; col < colCount; col++)
    if (ImageIcon.class == model.getColumnClass(col))
    for (int row = 0; row < rowCount; row++)
    ImageIcon icon = (ImageIcon) model.getValueAt(row, col);
    if (icon != null)
    icon.setImageObserver(new CellImageObserver(table, row,
    col));
    class CellImageObserver implements ImageObserver
    JTable table;
    int row;
    int col;
    CellImageObserver(JTable table, int row, int col)
    this.table = table;
    this.row = row;
    this.col = col;
    public boolean imageUpdate(Image img, int flags, int x, int y, int w,
    int h)
    if ((flags & (FRAMEBITS | ALLBITS)) != 0)
    Rectangle rect = table.getCellRect(row, col, false);
    table.repaint(rect);
    return (flags & (ALLBITS | ABORT)) == 0;
    public static void main(String[] args)
    AnimatedIconTableExample frame = new AnimatedIconTableExample();
    frame.addWindowListener(new WindowAdapter()
    public void windowClosing(WindowEvent e)
    System.exit(0);
    frame.setSize(300, 150);
    frame.setVisible(true);

    I've heard of that problem before... I think it has something to do with how the image is loaded. I found an example of how Sun does animated gifs here: http://java.sun.com/products/java-media/2D/samples/suite/Image/DukeAnim.java
    I hope it helps.

  • Problem with animated .gif

    I have a problem with animated gifs. So if I set a animated gif as background and a button is over it as in the example below, then everytime the animation goes on the button disappears until I go over it with the mouse. So what can I do to solve this?
    import java.awt.Color;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    public class FrameBackImage {
              public static void main(String args []){
                   final JFrame frame = new JFrame("Frame");
                   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                   frame.setSize(400, 400);
                   frame.setResizable(false);
                   frame.setLayout(null);
                   java.net.URL imageURL = ImageApp.class.getResource("animatedw.gif");
                   ImageIcon imageIcon = new ImageIcon(imageURL);
                 final JLabel label = new JLabel(imageIcon);
                 label.setBounds(0,0 , 400, 400);
                 frame.getLayeredPane().add(label);
                 JButton button = new JButton ("Exit");
                 button.setBounds(200, 129, 60, 60);
                 button.setBackground(Color.black);
                 button.setForeground(Color.white);
                 frame.add(button);
                 button.addActionListener(
                 new ActionListener(){
                        public void actionPerformed(ActionEvent arg0) {
                             System.exit(0);
                 frame.validate();
                  frame.setVisible(true);
    }

    In the future, Swing related questions should be posted in the Swing forum.
    Your usage of the getLayeredPane() method is something I've never seen before, so I don't know if thats the problem or not.
    How to display a "background image" is asked all the time in the Swing forum. So to familiarize yourself with the forum you can try searching the Swing forum. Using the keywords I highlighted would be a good place to start.

  • Animated gif on createCustomCursor

    Hello All,
    I am trying to show an animated gif on one of my custom cursors using :
    Toolkit tk = Toolkit.getDefaultToolkit();
    try{
    myFrame.setCursor(
    tk.createCustomCursor(ImageIO.read(this.getClass().getResourceAsStream("test.gif")),new Point(15,15),"MyCursor" ) );
    catch(Exception e){}But i always see a static image for that gif.
    And when i try to use the same Image to show it on a JLabel something like this :
    ImageIcon ii = new ImageIcon(this.getClass().getResource("test.gif"));
    JLabel label3 = new JLabel(ii);I see the animated image here.
    Can someone help in showing the animated gif on the customcursor.
    I have tried using the below discussion for reference but it didnt help for animated images.
    http://forums.sun.com/thread.jspa?threadID=267944
    Thanks for your time.

    Hello,
    But i always see a static image for that gif.[http://java.sun.com/javase/6/docs/api/java/awt/Toolkit.html#createCustomCursor(java.awt.Image,%20java.awt.Point,%20java.lang.String)]
    Note that multi-frame images are invalid and may cause this method to hang.--------
    Here is another approach:
    import java.awt.*;
    import java.awt.event.*;
    import java.net.*;
    import javax.swing.*;
    class AnimatedCursorTest {
      private javax.swing.Timer animator;
      private JButton button;
      private Toolkit tk    = Toolkit.getDefaultToolkit();
      private Cursor[] list = new Cursor[3];
      private URL url00 = getClass().getResource("32x32_00.png");
      private URL url01 = getClass().getResource("32x32_01.png");
      private URL url02 = getClass().getResource("32x32_02.png");
      private Point p   = new Point(0,0);
      public JComponent makeUI() {
        list[0] = tk.createCustomCursor(tk.createImage(url00), p, "00");
        list[1] = tk.createCustomCursor(tk.createImage(url01), p, "01");
        list[2] = tk.createCustomCursor(tk.createImage(url02), p, "02");
        animator = new javax.swing.Timer(100, new ActionListener() {
          private int counter = 0;
          public void actionPerformed(ActionEvent e) {
            button.setCursor(list[counter]);
            counter = (counter<list.length-1)?counter+1:0;
        button = new JButton(new AbstractAction("Start") {
          public void actionPerformed(ActionEvent e) {
            JButton b = (JButton)e.getSource();
            if(animator.isRunning()) {
              b.setText("Start");
              animator.stop();
            }else{
              b.setText("Stop");
              animator.start();
        button.setCursor(list[0]);
        JPanel p = new JPanel(new BorderLayout());
        p.add(button);
        p.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        return p;
      public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
          public void run() { createAndShowGUI(); }
      public static void createAndShowGUI() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.getContentPane().add(new AnimatedCursorTest().makeUI());
        frame.setSize(320,240);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

Maybe you are looking for