2010-02-06 54 views
3

我正試圖編寫一個應用程序,我想在Jpanel上添加不同的圖片。除了顯示質量很差的圖像的JPG格式,一切正常。 這是我做的繪圖:JPanel中的圖片

class draw extends Canvas 
{ 
    Dimension canvasSize = new Dimension(400, 400); 
    String fileName; 

    public void paint(Graphics g) 
    {  
     if(this.fileName!=null) 
     { 
      Toolkit toolkit = Toolkit.getDefaultToolkit(); 
      Image img = toolkit.getImage(fileName); 
      g.drawImage(img, 0, 0, this); 
     }     
    } 
    public void setFileName(String name) 
    { 
     this.fileName=name; 
    } 

    public Dimension getMinimumSize() 
    { 
     return canvasSize; 
    } 

    public Dimension getPreferredSize() 
    { 
     return canvasSize; 
    } 
} 

有沒有一種方法,使得JPG格式覆蓋?

+0

你試圖顯示的JPEG圖像有多大? 400 x 400 ...或更小? – Adamski 2010-02-06 13:29:09

回答

4

這可能是因爲您正在將圖像拉伸(或壓縮)到畫布的大小。縮放JPEG圖像時看起來不太好,特別是如果你要擴大規模的話。嘗試與您的畫布大小相同(或接近)的圖像。您還可以從Image類中獲取JPEG的高度和寬度,並以原始尺寸顯示它。 Sun的Drawing an Image教程演示瞭如何做到這一點。

+1

另外,Chris Campbell撰寫的這篇文章是一個非常好的圖像縮放資源,它通常和專門用於Java:http://today.java.net/pub/a/today/2007/04/03/perils-of-image- getscaledinstance.html – Ash 2010-02-06 14:02:40

2

發佈的代碼表示OP正在以原始大小繪製圖像。所以我對代碼的評論如下:

a)你說你想將圖像添加到JPanel,但出於某種原因,你正在擴展Canvas。堅持與Swing組件。然後,如果您需要自定義繪畫,則可以重寫paintComponent()方法而不是繪畫方法。

b)當您使用自定義繪畫時,您不應該在繪畫方法中讀取圖像。這種方法可以被稱爲無數次。有可能圖像沒有被完全讀入內存。我知道Swing會隨着更多的圖像被讀取而自動重繪,我不確定AWT Canvas是如何工作的。 c)另外,當重寫paint方法不要忘記調用super.paint(),super.paintComponent()或者你可能會得到意想不到的結果。

d)但是,根據發佈的代碼,甚至不需要自定義繪畫(因爲您正在以實際尺寸繪製圖像)。只需從圖像中創建一個ImageIcon並將圖標添加到JLabel。然後,您只需將標籤添加到GUI。

我建議您閱讀How to Use Icons的Swing教程中的部分。如果圖像質量差,那麼問題可能與您的圖像有關,因爲現在您使用的是標準代碼,而不是自定義代碼。

+0

謝謝,它幫助我! – 2010-02-06 19:02:27