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