2010-02-06 46 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