我试图在简单的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;
}
}
有谁知道为什么我关闭这个流?
提前致谢!
答案 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;