Gif 没有在 JFrame 中播放
Posted
技术标签:
【中文标题】Gif 没有在 JFrame 中播放【英文标题】:Gif not playing in JFrame 【发布时间】:2014-12-15 23:34:04 【问题描述】:您好,我在 JFrame 中有一个 gif。一切都很好,只是第一次冻结 gif 就好像它是 jpeg 或 png。
此外,*** 告诉我我需要添加更多详细信息,即使我已经添加了陈述我的问题所需的所有详细信息,所以请随意忽略这一点。
代码如下:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
public class LoadImageApp extends Component
BufferedImage img;
public void paint(Graphics g)
g.drawImage(img, 0, 0, this);
public LoadImageApp()
try
img = ImageIO.read(new File("spooky.gif"));
catch (IOException e)
public Dimension getPreferredSize()
if (img == null)
return new Dimension(100,100);
else
return new Dimension(img.getWidth(null), img.getHeight(null));
public static void main(String[] args)
JFrame f = new JFrame("Load Image Sample");
f.addWindowListener(new WindowAdapter()
public void windowClosing(WindowEvent e)
System.exit(0);
);
f.add(new LoadImageApp());
f.pack();
f.setVisible(true);
【问题讨论】:
我认为它是动画 GIF? 【参考方案1】:我很确定 ImageIO
在动画 gif 方面存在一些问题。
尝试使用JLabel
和图标,如下所示:
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);
【讨论】:
您还可以从ImageIcon.getImage()
获得一个Image
来进行绘画,如here 和here 所示。或者,如果您必须使用BufferedImage
,您可以从@MadProgrammer 关注these crazy instructions :-)
用f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
替换windowListener
恐怕这个选项不起作用,我已经尝试过 JLabel,这里的问题是某些 gif 在 java 程序中不起作用,我提出赏金是因为我想要弄清楚为什么有些 gif 可以在某些 Java 程序中工作,而另一些却不能,即使我们知道它们可以在其他程序或语言中工作
不如让我解释一下我的问题,它确实解决了使 gif 动画制作的原始问题,但是现在图像到处都是静态的乱码,实际上并没有多大帮助。也许你可以编辑你的答案来处理这个问题?如果您需要我使用的参考 gif,它是 camo.githubusercontent.com/…【参考方案2】:
如前所述,ImageIO
不会正确加载动画 GIF 的所有帧。但是Toolkit
方法之一会。例如
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);
如需进一步讨论,请参阅Show an animated BG in Swing。
【讨论】:
汤普森先生的杰作!赏金奖励时间限制一开启,50 个就是你的了!现在也许你可以多解释一下?我自己正在尝试理解为什么一个选项有效而另一个无效... 或者你可以买一台 Mac,在它上面动画 gif 似乎“正常工作”。本人在another question @DreadHeadedDeveloper “现在也许你可以多解释一下?” 我能得到的最好的解释是对链接问题的接受答案! (我真的不明白 为什么ImageIO
应该 fail 正确加载动画 GIF。)以上是关于Gif 没有在 JFrame 中播放的主要内容,如果未能解决你的问题,请参考以下文章