7

わかりました、これは本当に奇妙です。アプリケーションが初めて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)

エラーを掘り下げてみると、1つのアイコンでヘッダーを読み取ろうとすると、最初の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);
}

それがsuper(file)に入ると、そこに行きます:

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 

次に、上記の他のスレッドがアイコンを取得します(この投稿の2番目のスタックを参照)

4

2 に答える 2

1

どう言う意味ですか?キューは操作しません。

ごめん。@kaiが言ったように、私はイベントディスパッチスレッド(EDT)を意味しました。チュートリアルに示されているように、EDTでを含むすべてのコンポーネントを作成してください。そうしないと、ファイルシステムとディスプレイの間の競争になります。JFileChooser

私はちょうど気づきました:それはそれなしでまだ起こりIronFileChooserますか?

于 2012-08-10T13:19:33.537 に答える
0

私は非常によく似た問題を抱えていました。1.6.Xバージョン以降のフォームはJFileChooserのバグのようです。明らかな理由がない場合でも、この内部例外がスローされることがあります。それが修正されたか、あるいは適切に文書化されているかどうかはわかりません。また、これがあなたの状況に当てはまるかどうかはわかりませんが、この問題を思い出させてくれます。

于 2011-11-24T13:15:10.317 に答える