Java绘制GIF

时间:2014-01-04 17:28:44

标签: java swing jpanel gif paintcomponent

我正在尝试使用Java Graphics API绘制GIF,但我无法使用下面的代码成功绘制GIF。只绘制了GIF的第一个图像或缩略图,但它没有播放。

public void paintComponent(Graphics g){
    super.paintComponent(g);
    BufferedImage img = null;
    try {
        URL url = new URL("GIF URL");
        img = ImageIO.read(url);
    } catch (Exception e) {
    }       
    g.drawImage(img, 5, 5, this);
}

基本上我正在为登录屏幕创建图形,我想绘制一个循环的GIF。

编辑:更新了我的代码并稍微改了一下这个问题。

3 个答案:

答案 0 :(得分:1)

您可以将gif加载到BufferedImage对象中。 然后我们将缓冲的图像绘制到您的挥杆组件上

还必须更好地覆盖paintComponent方法

答案 1 :(得分:1)

完全可以这样做,你只需要有一个正确的方法来加载图像的帧。我用来做这个的代码如下:

private static Image load(final String url) {
    try {
        final Toolkit tk = Toolkit.getDefaultToolkit();
        final URL path = new URL(url); // Any URL would work here
        final Image img = tk.createImage(path);
        tk.prepareImage(img, -1, -1, null);
        return img;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

这使用Toolkit加载gif图片,因为如果我没记错的话,ImageIO此时无法正确加载GIF。

从那里开始,就像在(例如)JPanel中执行以下操作一样简单:

@Override
protected void paintComponent(Graphics g){
    super.paintComponent(g); // clear up render
    //...
    g.drawImage(IMAGE, x, y, this); // ImageObserver necessary here to update
    //...
}

示例:

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class GifAnimation {

    public GifAnimation(){
        JFrame frame = new JFrame("Gif Animation");
        GifPanel panel = new GifPanel(load("http://www.thisiscolossal.com/wp-content/uploads/2013/01/3.gif"));
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    private static Image load(final String url) {
        try {
            final Toolkit tk = Toolkit.getDefaultToolkit();
            final Image img = tk.createImage(new URL(url));
            tk.prepareImage(img, -1, -1, null);
            return img;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args){
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                new GifAnimation();
            }
        }
    }

    public class GifPanel extends JPanel {

        private final Image image;

        public GifPanel(Image image){
            this.image = image;
        }

        @Override
        protected void paintComponent(Graphics g){
            super.paintComponent(g);
            g.drawImage(image, 10, 10, this);
        }

        @Override
       public Dimension getPreferredSize(){
            return new Dimension(660, 660);
        }

    }

}

答案 2 :(得分:0)

使用JPanel的paint方法无法直接实现GIF动画。

我建议您在面板中插入JEditorPane,只要您想显示它并使用HTML在其中显示GIF。
请参阅showing images on jeditorpane (java swing)

虽然有些人可能批评它是一种粗暴的方式,但动画效果很好。

希望这有帮助。