Java Gif未在JFrame中播放

Java Gif未在JFrame中播放,java,image,swing,gif,Java,Image,Swing,Gif,你好,我有一个JFrame中的gif。除了gif第一次被冻结,就好像它是jpeg或png一样,一切都正常 另外,stackoverflow告诉我需要添加更多的细节,尽管我已经添加了陈述问题所需的所有细节,所以请忽略这一点 代码如下: }我敢肯定ImageIO在动画GIF方面存在一些问题 尝试使用JLabel and图标,如下所示: Icon icon = new ImageIcon(filename); JLabel gif = new JLabel(icon); JFrame f = new

你好,我有一个JFrame中的gif。除了gif第一次被冻结,就好像它是jpeg或png一样,一切都正常

另外,stackoverflow告诉我需要添加更多的细节,尽管我已经添加了陈述问题所需的所有细节,所以请忽略这一点

代码如下:

}

我敢肯定ImageIO在动画GIF方面存在一些问题

尝试使用JLabel and图标,如下所示:

Icon icon = new ImageIcon(filename);
JLabel gif = new JLabel(icon);

JFrame f = new JFrame("Load Image Sample");

f.addWindowListener(new WindowAdapter(){
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

f.getContentPane().add(gif);
f.pack();
f.setVisible(true);
如上所述,ImageIO无法正确加载动画GIF的所有帧。但工具箱中的一种方法会。例如

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

// Ach AWT!
//public class LoadImageApp extends Component {
public class LoadImageApp extends JPanel {

    Image img;

    // should be paintComponent for a JComponent
    //public void paint(Graphics g) {
    public void paintComponent(Graphics g) {
        super.paintComponent(g); // call super method first
        g.drawImage(img, 0, 0, this);
    }

    public LoadImageApp() {
        setBackground(Color.BLUE.darker().darker());
        try {
            URL url = new URL("http://i.stack.imgur.com/OtTIY.gif");
            // as mentioned, ImageIO will not load animated GIFs correctly.
            //img = ImageIO.read(url));
            // but the toolkit method will, OTOH..
            img = Toolkit.getDefaultToolkit().createImage(url);
            // ..we need a MediaTracker
            MediaTracker mt = new MediaTracker(this);
            mt.addImage(img, 0);
            mt.waitForAll();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Dimension getPreferredSize() {
        if (img == null) {
            return new Dimension(100, 100);
        } else {
            return new Dimension(img.getWidth(this), img.getHeight(this));
        }
    }

    public static void main(String[] args) {
        // should be donw on the EDT - BNI
        JFrame f = new JFrame("Load Image Sample");
        f.add(new LoadImageApp());
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

如需进一步讨论,请参阅。

我假设这是一个动画GIF?您还可以从ImageIcon.getImage获得一个要绘制的图像,如图和所示。或者,如果必须使用BuffereImage,可以从@MadProgrammer:-将windowListener替换为f.setDefaultCloseOperationJFrame.EXIT_ON_CLOSE;我担心这个选项不起作用,我已经试过JLabel了,这里的问题是某些gif在java程序中不起作用,我提出了悬赏,因为我想弄清楚为什么一些gif在某些java程序中起作用,但其他gif即使我们知道它们在其他程序或语言中也起作用。请允许我解释我的问题,它确实解决了使gif动画化的最初问题,但现在图像到处都是静态的乱码,它真的没有做更多的帮助。也许你可以编辑你的答案来处理这个问题?如果你需要我使用的参考gif,汤普森先生,这是了不起的工作!一旦赏金奖励的期限开始,50美元就是你的了!现在也许你可以再解释一下?我自己也在试图理解为什么一个选项起作用而另一个不起作用……或者你可以买一台Mac电脑,它上面的动画GIF看起来“很管用”。我现在在@dreadheaddeveloper中遇到了这个问题,也许你可以再解释一下?我能得到的最好的解释是在链接问题的公认答案中!我真的不明白为什么ImageIO不能正确加载动画GIF。
import java.awt.*;
import javax.swing.*;
import java.net.URL;

// Ach AWT!
//public class LoadImageApp extends Component {
public class LoadImageApp extends JPanel {

    Image img;

    // should be paintComponent for a JComponent
    //public void paint(Graphics g) {
    public void paintComponent(Graphics g) {
        super.paintComponent(g); // call super method first
        g.drawImage(img, 0, 0, this);
    }

    public LoadImageApp() {
        setBackground(Color.BLUE.darker().darker());
        try {
            URL url = new URL("http://i.stack.imgur.com/OtTIY.gif");
            // as mentioned, ImageIO will not load animated GIFs correctly.
            //img = ImageIO.read(url));
            // but the toolkit method will, OTOH..
            img = Toolkit.getDefaultToolkit().createImage(url);
            // ..we need a MediaTracker
            MediaTracker mt = new MediaTracker(this);
            mt.addImage(img, 0);
            mt.waitForAll();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public Dimension getPreferredSize() {
        if (img == null) {
            return new Dimension(100, 100);
        } else {
            return new Dimension(img.getWidth(this), img.getHeight(this));
        }
    }

    public static void main(String[] args) {
        // should be donw on the EDT - BNI
        JFrame f = new JFrame("Load Image Sample");
        f.add(new LoadImageApp());
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}