Jython Swing:Java ImageIO IOException 随机发生

3

我使用eclipse和pydev构建了一个Jython swing应用程序。我为所有按钮的背景使用简单的图像。大多数情况下,一切都很好。但是在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可能无法打开文件流,从而导致异常。您有没有任何关于如何追踪此问题的建议,或者我应该高兴地接受它已经安静地失败了?


4
你是否在事件分派线程上调用了ImageIO.read() - trashgod
确切地说,这种间歇性的 NPE 很可能是并发问题。我认为,在后台线程上调用 ImageIO.read() 是可以的,只要在图像完全加载完成之前不使用它们,并且所有 Swing 调用(例如将 ImageIcon 添加到 JLabel)都在 EDT 上执行。 - Hovercraft Full Of Eels
我假设这是问题所在,更实际的解决方案是什么?是让一个线程缓存所有图像,使其在应用程序启动时可以随处访问,还是为每个单独的图像发送一个线程?我在整个应用程序中使用大约2-3 MB的图像。 - sarwar
1个回答

3
“更实用的解决方案是什么:在应用程序启动时缓存所有图像或为每个单独的图像发送一个线程。我在整个应用程序中使用大约2-3 MB的图像。”
“很大程度上取决于预期的延迟和图像大小。这个 示例 将图像作为 List<ImageIcon> 缓存;新图像的轻微延迟几乎不可察觉,因为这些图像是分发 JAR 的一部分。相比之下,这个 示例 在应用程序启动时从网络获取图像,明显存在滞后。”
“对于长延迟或大量大型图像,您可能需要考虑使用 SwingWorker,如在此 Oracle 文章中讨论的那样,以及如何通过 Improve Application Performance With SwingWorker 来提高应用程序性能。”

1
谢谢。我打算将所有内容缓存起来,可能作为图像图标的Jython字典。这些图片已经随应用程序一起分发了。直到现在,我才意识到需要将它们从UI线程中加载出来。 - sarwar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接