2017-06-01 6 views
2

単純なJFrameにGifを表示しようとしています。私は "LoadingGif"クラスを作成しましたが、GIFが出現した後にこのエラーメッセージjava.io.IOException : Stream closedが1秒間表示されてから停止します。IOExceptionストリームがGifで終了する

私は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

どのようにこのクラスを使用していますか? –

+1

'imageIcon = new ImageIcon(url);このコードは 'if(f.isDisplayable()){f.dispose();'のように表示されますが、label/new JLabel(imageIcon); 'ラベル/アイコンはイメージを非同期的に読み込みますフレームが表示可能になるとすぐにJVMにイメージのロードを停止させます。私はそれが問題だと思う。 1)すぐに助けを求めるには、[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 2)画像を取得する方法の1つは、[このQ&A](http://stackoverflow.com/q/19209650/418556)に表示されている画像にホットリンクすることです。 –

+0

このクラスはシングルトンです。私は 'LoadingGif.getInstance.runUI()'を使ってmain()の最初のところでこのクラスを呼び出します。最後に 'LoadingGif.getInstance.stopLoading()'を呼び出します。 事はイメージですロードされ、gifが0.5秒でアニメーション化された場合、エラーメッセージが表示されます。 – Jooooris

答えて

0

まずサンプルコードを単純化しようとしました。たとえば、私はGIFファイルへのハードコードされたパスを使用しました(イメージの場所ですべてが問題ないことを保証するためにハードコードされており、クラスパスなどの問題はありません)。また、シングルトンファクトリーの代わりにLoadingGifクラスのコンストラクターを使用しました。

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の場合:

/** 
* 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; 
関連する問題