2017-06-01 3 views
2

Ich versuche, ein Gif auf einem einfachen JFrame anzuzeigen. Ich habe die Klasse "LoadingGif" erstellt, aber ich habe die Fehlermeldung java.io.IOException : Stream closed eine Sekunde nachdem das Gif erschienen ist, dann stoppt es.IOException Stream geschlossen am Gif

ich diese Klasse aufrufen mit LoadingGif.getInstance.runUI() und den Quellcode der Klasse ist:

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; 
    } 
} 

Weiß jemand, warum ich diesen Strom bekam geschlossen?

Vielen Dank im Voraus!

+1

Wie verwenden Sie/Aufruf dieser Klasse? –

+1

'imageIcon = neues ImageIcon (URL); label = new JLabel (imageIcon); 'Das Label/Icon lädt das Bild asynchron (während des Ladevorgangs können andere Dinge passieren), während dieser Code' if (f.isDisplayable()) {f.dispose(); 'wird Bewirkt, dass die JVM das Laden des Bildes stoppt, sobald der Rahmen angezeigt werden kann. Ich vermute, das ist das Problem. 1) Um eine bessere Hilfe zu erhalten, sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. 2) Eine Möglichkeit, Bilder für ein Beispiel zu erhalten, besteht darin, eine direkte Verbindung zu Bildern herzustellen, die in [diesem Q & A] (http://stackoverflow.com/q/19209650/418556) zu sehen sind. –

+0

Diese Klasse ist ein Singleton. Ich rufe diese Klasse ganz am Anfang meiner main() auf, indem ich 'LoadingGif.getInstance.runUI()' benutze, dann rufe ich ganz am Ende 'LoadingGif.getInstance.stopLoading()' Die Sache ist das Bild ist gut geladen, und das gif ist vielleicht für 0,5 Sekunden animiert, dann habe ich die Fehlermeldung erhalten. – Jooooris

Antwort

0

Ich habe versucht, zuerst Ihren Beispielcode zu vereinfachen. Zum Beispiel habe ich gerade einen hartcodierten Pfad zur GIF-Datei verwendet (er ist vorerst fest codiert, um sicherzustellen, dass alles mit dem Speicherort des Bildes in Ordnung ist und es keine Probleme mit dem Klassenpfad usw. gibt). Auch ich habe Konstruktor LoadingGif Klasse statt Singleton Fabrik verwendet.

Mein Beispielcode sieht wie folgt aus:

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(); 
    } 
} 

Und die GIF animiert und ohne Fehler angezeigt.

In meinem Fall ist GIF-Datei nicht riesig. Kann in Ihrem Fall sein, es ist sehr groß und braucht etwas Zeit zum Laden, wie bereits @Andrew Thompson sagte. Wie auch immer, Sie können überprüfen, ob das Bild mit Hilfe der Methodegeladen wurde und dann die zurückgegebene Flagge überprüfen. Für java.awt.MediaTracker#COMPLETE Javadoc sagt:

/** 
* 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; 
Verwandte Themen