我使用eclipse和pydev构建了一个Jython swing应用程序。我使用简单的图像作为所有按钮的背景。 95%的时间,一切都运作得非常好。但是,在屏幕上添加或删除内容时,大约有5%的时间会发生这种情况:
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可能无法打开文件流,导致异常。关于如何追踪这个问题的任何建议,或者我应该感到高兴我能让它安静地失败吗?
答案 0 :(得分:3)
什么是更实用的解决方案:让线程缓存应用程序启动时可访问的所有图像或为每个单独的图像发送线程。我在整个应用程序中使用大约2-3 MB的图像。
很大程度上取决于预期的延迟和图像大小。这个简单的example缓存了List<ImageIcon>
中的图像;新图像的轻微延迟是难以察觉的,因为图像是分布JAR的一部分。相反,当应用程序在启动时从网络获取图像时,此example明显滞后。
对于长延迟或大量大图片,您可能需要考虑SwingWorker
,如本Oracle文章中关于如何Improve Application Performance With SwingWorker所述。