IOException流在Gif上关闭

时间:2017-06-01 13:57:38

标签: java swing gif ioexception

我试图在简单的JFrame上显示Gif。我创建了#34; LoadingGif"类,但是在Gif出现后我得到了这个错误消息java.io.IOException : Stream closed,然后停止了。

我用LoadingGif.getInstance.runUI()调用此类,该类的源代码为:

public class LoadingGif {

    private static LoadingGif instance = null;

    private JFrame f;
    private JLabel label;
    private URL url;
    private ImageIcon imageIcon;

    private LoadingGif()
    {
         url = TraceaReq.class.getResource("/load.gif");
         imageIcon = new ImageIcon(url);
         label = new JLabel(imageIcon);
    }

    public void runUI()
    {
         f = new JFrame(RQTFGenDOORS.VERSION+" - Loading...");
         f.getContentPane().add(label);
         f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
         f.pack();
         f.setLocationRelativeTo(null);
         f.setResizable(false);
         f.setVisible(true);
         f.setAlwaysOnTop(true);
    }

    public void stopLoading(){
        if(f.isDisplayable())
        {
            f.dispose();
        }
    }

    public static LoadingGif getInstance()
    {
        if(instance == null)
        {
            instance = new LoadingGif();
        }
        return instance;
    }
}

有谁知道为什么我关闭这个流?

提前致谢!

1 个答案:

答案 0 :(得分:0)

我首先尝试简化您的示例代码。例如,我刚刚使用了GIF文件的硬编码路径(现在它已经硬编码,以确保图像位置一切正常,类路径没有任何问题等)。我也使用了LoadingGif类的构造函数而不是singleton factory。

我的示例代码如下所示:

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class LoadingGif {

    private JFrame frame;
    private JLabel label;
    private ImageIcon imageIcon;

    private LoadingGif() {
        imageIcon = new ImageIcon("/home/me/Temp/loading-gif/src/animated-penguin-gif-5.gif");
        label = new JLabel(imageIcon);
    }

    public void runUI() {
        frame = new JFrame("MyGif - Loading...");
        frame.getContentPane().add(label);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setAlwaysOnTop(true);
    }

    public static void main(String args[]) {
        LoadingGif loadingGif = new LoadingGif();
        loadingGif.runUI();
    }   
}

GIF动画显示,没有任何错误。

在我的情况下,GIF文件并不大。可能在你的情况下它非常大并需要一些时间来加载,因为已经 @Andrew Thompson 说。无论如何,您可以使用javax.swing.ImageIcon#getImageLoadStatus方法检查图像是否已加载,然后检查返回的标志。对于java.awt.MediaTracker#COMPLETE Javadoc说:

/**
 * Flag indicating that the downloading of media was completed
 * successfully.
 * @see         java.awt.MediaTracker#statusAll
 * @see         java.awt.MediaTracker#statusID
 */
public static final int COMPLETE = 8;