2011-12-08 1 views
3

私は、eclipseとpydevを使用してJythonのスイングアプリを構築しました。私はすべてのボタンの背景に簡単なイメージを使用しました。 95%の時間で、すべてがすばらしく機能します。ただし、画面からコンテンツを追加または削除時間の約5%、これが発生します。Jython Swing:ランダムに発生するJava ImageIO IOException

Exception in thread "AWT-EventQueue-0" at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1310) 
    at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1579) 
    at javax.imageio.ImageIO.read(ImageIO.java:1438) 
    at javax.imageio.ImageIO.read(ImageIO.java:1342) 
    at sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:616) 

javax.imageio.IIOException: javax.imageio.IIOException: Error reading PNG image data 

をイライラすることは、それが容易に再現可能ではないということです、と私はPNGを描くアプリケーションのどこにでも発生する可能性があります。私は確かに例外をキャッチしてイメージを再インポートすることができますが、根本的な原因を突き止めることを望んでいます。

私はそうのようなリソースを呼び出す:

notPressed = ImageIO.read(pkg_resources.resource_stream('images', "button-blue.png")).getScaledInstance(width,height, Image.SCALE_SMOOTH) 

私の唯一の推測では、時々pkg_resourcesは例外を発生させ、ファイルストリームをオープンに失敗するかもしれないということです。これを追跡する方法に関する提案や、私が静かに失敗させることができてうれしいか?

+4

[イベントディスパッチスレッド](http://download.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)で 'ImageIO.read()'を呼び出していますか? – trashgod

+0

正確 - この断続的なNPEは、並行性の問題について非常に不審な匂いがします。 ImageIO.read()をバックグラウンドスレッドで呼び出すのは問題ありません。画像が完成するまで、そしてSwingの呼び出し(ImageIconをJLabelに追加するなど)が完了するまで、画像を使用しない限りです。 EDT。 –

+0

私は午前。それが問題だとすれば、もっと実用的な解決策は何ですか?アプリケーションの起動時にどこかにアクセス可能なすべてのイメージをスレッドキャッシュに保持するか、個々のイメージごとにスレッドを送信する。アプリケーション全体で約2〜3MBの画像を使用します。 – sarwar

答えて

3

もっと実用的な解決策:アプリケーションの起動時にどこかにアクセス可能なすべての画像をスレッドキャッシュに入れるか、個々の画像ごとにスレッドを送信する。アプリケーション全体で約2〜3MBの画像を使用します。

予想される待ち時間と画像サイズによって大きく異なります。この単純なexampleは、List<ImageIcon>に記載されているように画像をキャッシュします。イメージがディストリビューションJARの一部であるため、新しいイメージのわずかな遅延は目に見えません。対照的に、このexampleは、起動時にアプリケーションがネットワークからイメージを取得する際に、明らかに遅れます。

長いレイテンシまたは多数の大きなイメージの場合は、このオラクルの記事Improve Application Performance With SwingWorkerで説明されているように、SwingWorkerと考えるとよいでしょう。

+1

ありがとうございます。おそらく、イメージコンのJython辞書として、すべてをキャッシュするつもりです。画像はすでにアプリケーションとともに配布されています。私は今までUIスレッドからそれらをロードする必要性を見ていませんでした。 – sarwar

関連する問題