一个问题标题:在JPanel中添加图片

3

我正在尝试编写一个应用程序,其中我想在Jpanel上添加不同的图片。除了JPG格式外,一切正常,因为它显示非常糟糕的图像质量。 这是我的绘画方法:

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格式?

你要显示的JPEG图像有多大?是400 x 400还是更小? - Adamski
2个回答

4

这可能是因为您将图像拉伸(或缩小)到画布的大小。当您缩放JPEG图像时,它们看起来不太好,特别是当您进行放大时。尝试使用与画布相同大小(或接近)的图像。您还可以从Image类中获取JPEG的高度和宽度,并以其原始尺寸显示。 Sun的绘图教程展示了如何实现这一点。


1
此外,Chris Campbell的这篇文章是一份关于图像缩放的绝佳资源,不仅涵盖了一般的图像缩放知识,还特别针对Java进行了详细介绍。链接如下:http://today.java.net/pub/a/today/2007/04/03/perils-of-image-getscaledinstance.html - Ash

2
发布的代码表示用户正在以原始大小绘制图像。因此,我的意见是:
a)您说您想将图像添加到JPanel中,但出于某种原因,您正在扩展Canvas。坚持使用Swing组件。然后,如果需要进行自定义绘制,则应覆盖paintComponent()方法而不是paint()方法。
b)当使用自定义绘画时,您永远不应该在绘画方法中读取图像。该方法可能会被多次调用。也可能尚未完全将图像读入内存。我知道Swing会自动重绘更多的图像,但我不确定AWT Canvas如何工作。
c)此外,当覆盖paint方法时,不要忘记调用super.paint(),super.paintComponent(),否则可能会得到意外的结果。
d)然而,根据发布的代码,甚至没有必要进行自定义绘画(因为您正在按实际大小绘制图像)。只需从图像创建ImageIcon,然后将图标添加到JLabel即可。然后,只需将标签添加到GUI中即可。
我建议你阅读 Swing 教程中关于 如何使用图标 的章节。如果图像质量不好,那么问题很可能出在你的图像上,因为现在你正在使用标准代码,而不是自定义代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接