【问题标题】:IOException when opening JFileChooser打开 JFileChooser 时出现 IOException
【发布时间】:2011-12-16 07:54:45
【问题描述】:

好吧,这个真的很奇怪。每次我的应用程序第一次打开 JFileChooser 时,它都会引发 IOException,然后某些图标无法正确显示。

java.io.IOException
    at sun.awt.image.GifImageDecoder.readHeader(GifImageDecoder.java:265)
    at sun.awt.image.GifImageDecoder.produceImage(GifImageDecoder.java:102)
    at sun.awt.image.InputStreamImageSource.doFetch(InputStreamImageSource.java:246)
    at sun.awt.image.ImageFetcher.fetchloop(ImageFetcher.java:172)
    at sun.awt.image.ImageFetcher.run(ImageFetcher.java:136)

现在,当我深入研究错误时,似乎在一个图标上尝试读取标题时,它只检索前 8 个字节,这还不够。我已经检查了图标文件,它们看起来都很好。 我试图用另一个在此错误之前正确加载但相同的图标文件覆盖图标文件。

这是我遇到此错误时的堆栈:

Daemon Thread [Image Fetcher 0] (Suspended (exception IOException)) 
    GifImageDecoder.readHeader() line: 265 [local variables unavailable]    
    GifImageDecoder.produceImage() line: 102 [local variables unavailable]  
    ByteArrayImageSource(InputStreamImageSource).doFetch() line: 246    
    ImageFetcher.fetchloop() line: 172  
    ImageFetcher.run() line: 136 [local variables unavailable]

这是我在挖掘 GifImageDecoder 实例时的变量值。

source  ByteArrayImageSource  (id=272)  
awaitingFetch   false   
consumers   null    
decoder GifImageDecoder  (id=271)   
decoders    GifImageDecoder  (id=271)   
imagedata    (id=307)   
    [0] 71  
    [1] 73  
    [2] 70  
    [3] 56  
    [4] 57  
    [5] 97  
    [6] 16  
    [7] 13  
    [8] 10  
imagelength 9   
imageoffset 0   

通常,此图像数据应该更大。如您所见,前 10 个字节是标头,但它只检索 8 个字节。在此异常之后,来自 JFileChooser 的所有其他图标都无法正确加载。

这是对 readHeader() 的正确调用:

source  ByteArrayImageSource  (id=208)  
awaitingFetch   false   
consumers   null    
decoder GifImageDecoder  (id=207)   
decoders    GifImageDecoder  (id=207)   
imagedata    (id=223)   
    [0...99]    
    [100...199] 
    [200...299] 
    [300...399] 
    [400...499] 
    [500...599] 
    [600...699] 
    [700...799] 
    [800...899] 
    [900...979] 
imagelength 980 
imageoffset 0   

缓冲区在引发错误的图标之前完全加载了一个图标。

这里是它可能崩溃的一个例子(它发生在我的代码的几个部分,每当我第一次加载我的系统图标时):

public class DirectoryBrowser extends JFileChooser{

private String suffixAccepted = null;

public DirectoryBrowser(File file, String chooserTitle, String approveOpenBtnText, String suffixAccepted)
{
    super(file);
    this.suffixAccepted = suffixAccepted;
    init(chooserTitle, approveOpenBtnText);
}

当它进入超级(文件)时,它会去那里:

Thread [AWT-EventQueue-0] (Suspended)   
    Object.wait(long) line: not available [native method]   
    MediaTracker.waitForID(int, long) line: 651 
    ImageIcon.loadImage(Image) line: 234    
    ImageIcon.<init>(byte[]) line: 215  
    SwingUtilities2$2.createValue(UIDefaults) line: 1105    
    UIDefaults.getFromHashtable(Object) line: 185   
    UIDefaults.get(Object) line: 130    
    MultiUIDefaults.get(Object) line: 44    
    MultiUIDefaults(UIDefaults).getIcon(Object) line: 411   
    UIManager.getIcon(Object) line: 613 
    IronFileChooserUI(BasicFileChooserUI).installIcons(JFileChooser) line: 233  
    IronFileChooserUI(BasicFileChooserUI).installDefaults(JFileChooser) line: 219   
    IronFileChooserUI(BasicFileChooserUI).installUI(JComponent) line: 135   
    IronFileChooserUI(MetalFileChooserUI).installUI(JComponent) line: 139   
    DirectoryBrowser(JComponent).setUI(ComponentUI) line: 653   
    DirectoryBrowser(JFileChooser).updateUI() line: 1757    
    DirectoryBrowser(JFileChooser).setup(FileSystemView) line: 366  
    DirectoryBrowser(JFileChooser).<init>(File, FileSystemView) line: 332   
    DirectoryBrowser(JFileChooser).<init>(File) line: 315   
    DirectoryBrowser.<init>(File, String, String, String) line: 33  
    PackToIntegratePanel.choosePackPathToIntegrateFile() line: 522  
    PackToIntegratePanel$1.actionPerformed(ActionEvent) line: 104   
    JButton(AbstractButton).fireActionPerformed(ActionEvent) line: 1849 
    AbstractButton$Handler.actionPerformed(ActionEvent) line: 2169  
    DefaultButtonModel.fireActionPerformed(ActionEvent) line: 420   
    DefaultButtonModel.setPressed(boolean) line: 258    
    BasicButtonListener.mouseReleased(MouseEvent) line: 236 
    JButton(Component).processMouseEvent(MouseEvent) line: 5517 
    JButton(JComponent).processMouseEvent(MouseEvent) line: 3135    
    JButton(Component).processEvent(AWTEvent) line: 5282    
    JButton(Container).processEvent(AWTEvent) line: 1966    
    JButton(Component).dispatchEventImpl(AWTEvent) line: 3984   
    JButton(Container).dispatchEventImpl(AWTEvent) line: 2024   
    JButton(Component).dispatchEvent(AWTEvent) line: 3819   
    LightweightDispatcher.retargetMouseEvent(Component, int, MouseEvent) line: 4212 
    LightweightDispatcher.processMouseEvent(MouseEvent) line: 3892  
    LightweightDispatcher.dispatchEvent(AWTEvent) line: 3822    
    WorkbenchFrame(Container).dispatchEventImpl(AWTEvent) line: 2010    
    WorkbenchFrame(Window).dispatchEventImpl(AWTEvent) line: 1791   
    WorkbenchFrame(Component).dispatchEvent(AWTEvent) line: 3819    
    EventQueue.dispatchEvent(AWTEvent) line: 463    
    EventDispatchThread.pumpOneEventForHierarchy(int, Component) line: 242  
    EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component) line: 163   
    EventDispatchThread.pumpEvents(int, Conditional) line: 157  
    EventDispatchThread.pumpEvents(Conditional) line: 149   
    EventDispatchThread.run() line: 110 

然后上面提到的其他线程检索图标(参见这篇文章的第二个堆栈)

【问题讨论】:

  • 你在处理事件队列吗?
  • Are you working on the event queue? 什么意思?我不操纵任何队列。
  • 图标存储在哪里?是“默认”JFileChooser 图标还是您的图标?请添加一些代码,它会有所帮助。
  • 卡特琳娜岛的意思是事件调度线程。如果代码在 EDT 中被执行。
  • 我使用 java 的默认外观和感觉,所以我的图标在 jdk 库中。是的,显然它在 EDT 上运行,我将尝试将其移至另一个专有线程。或者,也许在我的应用程序第一次启动时,我可以加载外观,以便将图像加载到单独的线程上,然后在 EDT 中加载时不会崩溃。总有一天会试试的,谢谢

标签: java swing exception jfilechooser event-dispatch-thread


【解决方案1】:

什么意思?我不操纵任何队列。

对不起。就像@kai 说的,我的意思是event dispatch thread (EDT)。确保在 EDT 上创建所有组件,包括 JFileChooser,就像它们在 tutorial 中显示的一样。如果你不这样做,这将是一些文件系统和你的显示器之间的竞争。

我刚刚注意到:如果没有 IronFileChooser 的东西,它仍然会发生吗?

【讨论】:

  • 我尝试过在执行操作时使用 invokeLater,但它仍然存在问题。但我认为你的线程是正确的,我需要重新设计整个事情并确保它在 EDT 中。
  • IronFileChooser 只是外观,我试过没有它,它仍然是一样的。无论如何,你是最接近答案的人,我现在只需要修复它。谢谢
  • 好的;值得一试。您可以试试这个ThreadCheckingRepaintManager 来查找 EDT 问题。
【解决方案2】:

我有一个非常相似的问题。从 1.6.X 版本开始,这似乎是一个 JFileChooser 错误。有时它会无缘无故地抛出这个内部异常。我不确定它是否已修复,甚至是否正确记录。另外,我不确定这是否适用于您的情况,但它确实让我想起了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 2011-09-07
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多