【发布时间】:2012-01-15 13:17:38
【问题描述】:
我已经使用 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 可能无法打开文件流,从而导致异常。关于如何追踪这个问题的任何建议,还是我应该很高兴我可以让它安静地失败?
【问题讨论】:
-
你在event dispatch thread上打电话给
ImageIO.read()吗? -
完全正确——这种间歇性的 NPE 闻起来非常可疑,可能存在并发问题。我认为在后台线程上调用 ImageIO.read() 是可以的,只要在图像完成之前不使用图像并且只要所有 Swing 调用(例如将 ImageIcon 添加到 JLabel)都已完成美国东部时间。
-
我是。假设这是问题所在,还有什么更实际的解决方案;有一个线程缓存所有图像在应用程序启动时可访问的某个地方或为每个单独的图像发送一个线程。我在整个应用程序中使用了大约 2-3 MB 的图像。