Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why gif animation doesn't animate when using it in paintComponent()?

I'm using paintComponent() to paint a gif animated image at the backgound of JPanel. It shows up the gif but doesn't animate. I use java 1.5 and i know that i can use label with icon.

Does any body know why and how to fix it?

    private static class CirclePanel extends JPanel {

    ImageIcon imageIcon = new ImageIcon(BarcodeModel.class.getResource("verify.gif"));
    Point point = f.getLocation();
    protected void paintComponent(Graphics g) {
        Graphics gc = g.create();
        Graphics2D g2d = (Graphics2D) g.create();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
        g2d.setColor(Color.BLUE);
        g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, null);
        g2d.drawRect(0, 0, getWidth(), getHeight());
        g2d.setStroke(new BasicStroke(10f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER));
        g2d.setFont(g.getFont().deriveFont(Font.BOLD | Font.ITALIC,15f));
        g2d.drawString("Wait Please ...",getWidth()/2-imageIcon.getIconHeight()/3,getHeight()/2+imageIcon.getIconHeight()+15);

        g2d.dispose();

}

This is the gif image.
enter image description here

Edited: just add image observer to the g2d.drawImage() method.

 g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, this);
like image 356
itro Avatar asked Jul 25 '12 11:07

itro


People also ask

Why doesn t my animated GIF work?

If your GIF file is not playing or looping, it might be because the file is too large. If it's more than 1080 pixels high or 1920 pixels wide, you'll need to reduce the size. There are a number of free, online tools of varying sophistication that you can use.

Why GIF is not working in powerpoint?

To play animated GIF files, you must open the files in the Preview/Properties window. To do this, select the animated GIF file, and then on the View menu, click Preview/Properties. If the GIF does not play, try re-saving the animated GIF in the collection in which you want to put it.

Do GIFs in emails work?

The good news is that most email clients – like Gmail – support GIF files. Animated GIFs work in all webmail clients and most desktop and mobile clients. The only email client that can be stingy about sending GIFs in emails is Microsoft Outlook.


2 Answers

The reason is that the standard Java ImageIO API only loads the first image of the gif. How to fix? Google for a Gif Loader for Java, which loads every image of the gif. Then you have to paint the right image at the right time. An alternative way would be to have different png files representing each time one frame of the animation.

Update: Well... Actually, after doing some research, it looks like the way you did it actually loads all the frames of the animated gif. The reason for it is that the ImageIcon's method getImage() always returns the first image.

To fix it, you can try this (I'm not sure if it will work...)

Instead of using Grahpics.drawImage(), use ImageIcon.paintIcon(). Like this:

imageIcon.paintIcon(this, g2d, getWidth() / 2 - imageIcon.getIconWidth() / 2, getHeight() / 2);
like image 127
Martijn Courteaux Avatar answered Sep 27 '22 18:09

Martijn Courteaux


Image observer will take care of it. You should just pas the observer to the g2d.drawImage(); as below.

g2d.drawImage(imageIcon.getImage(), getWidth() / 2, getHeight() / 2, this);

In my case 'this' refer to CirclePanel which extends JPanel, it can be any thing for example if you are using gif as a icon for a button, you should use button as image observer.

like image 33
itro Avatar answered Sep 27 '22 17:09

itro