2017-06-10 46 views
-2

當執行我的代碼,有一個錯誤的問題與此代碼:在java中顯示圖像時出錯。 AWT-EventQueue的 - 0錯誤

ok.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 

       String path = ""; 
       String extension = ""; 

       JFileChooser fileChooser = new JFileChooser(); 
       int returnValue = fileChooser.showOpenDialog(null); 
       if (returnValue == JFileChooser.APPROVE_OPTION) { 
        File selectedFile = fileChooser.getSelectedFile(); 

        path = selectedFile.getAbsolutePath(); 

        int i = path.lastIndexOf('.'); 
        if (i >= 0) { 
         extension = path.substring(i+1); 
        } 
       } 

       try { 

        if (extension.equals("ppm")) { 

         Paint.imgs.add(new ppm(path)); 

       img.setImage(resize(Paint.imgs.get(Integer.parseInt(path)).img, 544, 372)); 
       img.repaint(); 

        } 

       } catch (IOException ex) { 
        Logger.getLogger(getName()).log(Level.SEVERE, null, ex); 
       } 

      } 

     }); 
與線 img.setImage(resize(Paint.imgs.get(Integer.parseInt(path)).img, 544, 372));

它看起來像路徑圖像是正確的

特別,所以我不知道爲什麼它不起作用。 輸出是:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "C:\Users\ciola\Desktop\pb.ppm" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:580) 
    at java.lang.Integer.parseInt(Integer.java:615) 
    at paint.binar$1.actionPerformed(binar.java:435) 
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
    at java.awt.Component.processMouseEvent(Component.java:6533) 
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
    at java.awt.Component.processEvent(Component.java:6298) 
    at java.awt.Container.processEvent(Container.java:2236) 
    at java.awt.Component.dispatchEventImpl(Component.java:4889) 
    at java.awt.Container.dispatchEventImpl(Container.java:2294) 
    at java.awt.Component.dispatchEvent(Component.java:4711) 
    ... 

任何想法如何解決這個問題?

+2

您在路徑上調用Integer.parseInt是錯誤的。這絕對是錯誤的 – ControlAltDel

+0

@ControlAltDel,然後,它不起作用。紅色下劃線。 –

+0

這是因爲您正在嘗試引用數組中的某些東西。我不知道你期望如何從文件路徑轉到數字索引 – ControlAltDel

回答

0

您的代碼的邏輯存在問題。由於寫它這樣做:

  • 得到一個文件
  • 絕對路徑找到擴展
  • 如果擴展名是「PPM」:
    • 負荷的圖像傳送到高速緩存(I」猜這是什麼Paint.imgs.add(new ppm(path))打算做的事。
    • 使用path作爲索引緩存獲取圖像。

但是,這是問題所在。 path不是索引。這是絕對路徑名。這是完整路徑名與目錄部分和文件名部分...完整的擴展名。你不能解析作爲一個整數。

解決方案:不清楚 - 這取決於您的緩存策略以及圖像如何實際識別。

  • 如果路徑名實際上確實包含對應於您的緩存索引方案的唯一編號,然後修改get(Integer.parseInt(path))來解析之前,path提取的唯一編號。

  • 如果沒有,那麼你需要做一些其他方式的圖像緩存查找。


建議:爲了避免此類問題,有你的代碼是如何真正應該工作一個明確的心理模型。

@ControlAltDel,那麼它不起作用。紅色下劃線。

這有力地表明你有你在哪裏,通過嘗試一些改變使編譯錯誤消失。這種方法有時會起作用:有時候,你很幸運!但是經常會導致一個沒有意義的程序 ...並在您嘗試運行時出現運行時錯誤。

更好的主意是理解編譯器告訴你什麼,然後理解你的錯誤的真實性質。編譯器(或你的IDE)不明白你想要做什麼。它的「建議」就是這樣。這取決於你在選擇接受哪個(如果有的話)時做出合理的決定。