2013-11-24 119 views
1

我想讀取文件以獲取某些點,然後在圖像上繪製這些點。目前,我可以在圖像上繪製值,但文件被讀取三次,矩形繪製三次。我不知道問題在哪裏。以下是代碼。 Read()函數單獨工作,所以我沒有將它包含在代碼中。在Jframe圖像上繪圖

P.S:我是JAVA的初學者,不太瞭解JFrame和Jcomponent。

 public class LoadImageApp extends JComponent { 

    BufferedImage img; 

    protected void paintComponent(Graphics g) { 

     super.paintComponent(g); 
     g.drawImage(img, 0, 0, null); 

     Read(g);// This is the function in which I read a file. 
    } 

public LoadImageApp() { 
     try { 
      img = ImageIO.read(this.getClass().getResource("/New York.jpg")); 
     } catch (IOException e) { 
     } 

    } 

    public Dimension getPreferredSize() { 
     if (img == null) { 
      return new Dimension(100,100); 
     } else { 
      return new Dimension(img.getWidth(null), img.getHeight(null)); 
     } 
    } 



public static void main(String[] args) { 


     JFrame f = new JFrame("Load Image Sample"); 

     f.addWindowListener(new WindowAdapter(){ 
       public void windowClosing(WindowEvent e) { 
        System.exit(0); 
       } 
      }); 
     LoadImageApp img = new LoadImageApp(); 
     f.add(img); 
     f.pack(); 
     f.setVisible(true); 


    } 
} 
+1

1)對代碼塊使用一致的邏輯縮進。代碼的縮進旨在幫助人們理解程序流程。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

3

不要,不要,請勿任何繪畫方法中從文件中讀取諸如paintComponent(...)。 :)

  1. 該方法應該只用於繪畫。越慢,GUI的表現就越差。
  2. 您無法控制該方法被調用的次數,因爲它不受您,程序員直接控制。
  3. 如果調用paintComponent方法,那麼您甚至無法完全控制,因爲JVM可能會決定堆疊太多的重繪請求,並且可能無法兌現所有這些方法。

相反

  • 讀入的數據在構造函數或類似的東西一次
  • 我會創建一個讀取方法,將我的點存儲在ArrayList<Point>中,然後在paintComponent方法內部,使用for循環遍歷該ArrayList並繪製它們。
  • 如果點在程序運行過程中沒有改變,您甚至可以通過獲取其Graphics上下文並使用它將點繪製到圖像上,直接將它們繪製到BufferedImage上,然後在您的圖像中顯示新的BufferedImage paintComponent方法。

其他建議:

  • 這,你看你的形象空的catch塊是做危險的事情。這是您閉着眼睛駕駛摩托車的代碼。至少打印一個堆棧跟蹤。
  • WindowListener不是必需的。相反,只需將JFrame的defaultCloseOperation設置爲JFrame.EXIT_ON_CLOSE:f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);