在JLabel中加载动态GIF出现异常情况

6

我正在尝试在JLabel中加载一个动画GIF。

虽然这个方法可以实现:

URL urlsd;
try {
    urlsd = new URL("http://pscode.org/media/starzoom-thumb.gif");
    ImageIcon imageIcon = new ImageIcon(urlsd); 
    JLabel progress = new JLabel(imageIcon);    
    progress.setBounds(5, 20, 66, 66);
    contentPane.add(progress);
} catch (MalformedURLException e) {
    e.printStackTrace();
}

另一方面,这并不是我想要的,我不想从URL获取GIF,因为我已经有了GIF。加载此内容的结果仅显示GIF的第一帧:
try {   
    ImageIcon imageIcon = new ImageIcon(ImageIO.read(ClassLoader.getSystemResourceAsStream("res/images/progress_indicator.gif")));

    JLabel progress = new JLabel(imageIcon);
    imageIcon.setImageObserver(progress);
    progress.setBounds(5, 20, 66, 66);
    contentPane.add(progress);
} catch (MalformedURLException e) {

    e.printStackTrace();
}

我猜这一定有原因,但我找不到它。

谢谢! Alex


ClassLoader并不是访问“应用程序资源”的正确方式,可以尝试使用这个链接,希望能对你有所帮助:如何将图片加载到你的项目中 - nIcE cOw
为什么不使用在这篇 Java文档 中所描述的ClassLoader呢?该文档指出,"所有类加载器都会首先将资源作为系统资源搜索,类似于搜索类文件"。 - nIcE cOw
@AlejandroVK:要查看一个可用的示例,请参考此线程 - nIcE cOw
3个回答

12

您可以尝试这样加载您的 GIF 文件:

public class Test extends JPanel {
    public Test() {
        ImageIcon imageIcon =
          new ImageIcon(Test.this.getClass().getResource("starzoom-thumb.gif"));
    }
}

如果您的上下文是静态的,则使用Test.class.getResouce()


啊哈,我会选择这个答案,getClass().getResource(...)就是正确的方法 :-) - nIcE cOw
我怀疑这就是答案。使用 getResourceAsStream 返回的流会发生奇怪的事情(例如声音应用程序可能会失败,因为该流“不可重新定位”)。但如果提供一个URL,它就可以正常工作。 - Andrew Thompson
谢谢,它起作用了,尽管我不得不查看https://dev59.com/cV_Va4cB1Zd3GeqPUY2X#9278270才意识到我必须先包含一个斜杠...这是使用getSystemResourceAsStream方法不需要的:D - AlejandroVK
请注意,如果您的GIF位于myProject/src/main/resources/icons/myGif.gif,则应将"icons/myGif.gif"传递给getResource。这与使用getResourceAsStream的用法不同,在该用法中,您必须在文件路径前加上斜杠:"/icons/myGif.gif - Matthias Braun

0
以下代码对我来说是有效的,它将显示动画而不是图像的第一帧。
public class Test extends JPanel {
    public Test() {
        ImageIcon yyyyIcon = new ImageIcon(xxx.class.getClassLoader().getResource("yyyy.gif"));
        connectionLabel.setIcon(yyyy);   
    }
}

请添加一些解释。 - jmattheis

0

所以还有一种更简单的方法来实现它。以下是我使用的代码行。

this.setContentPane(new JLabel(new ImageIcon("Path To Gif File")));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接