我有一个JPanel,我想添加我在飞行中生成的JPEG和PNG图像。

到目前为止,我在Swing教程中看到的所有示例,特别是在Swing示例中,都使用了ImageIcons。

我将这些图像生成为字节数组,它们通常比示例中使用的普通图标大,为640x480。

在使用ImageIcon类在JPanel中显示这样大小的图像时,是否存在任何(性能或其他)问题? 通常的做法是什么? 如何添加一个图像到JPanel而不使用ImageIcon类?

编辑:对教程和API进行更仔细的检查可以发现,您不能将ImageIcon直接添加到JPanel中。相反,它们通过将图像设置为JLabel的图标来实现相同的效果。这感觉不对……


当前回答

JLabel imgLabel = new JLabel(new ImageIcon("path_to_image.png"));

其他回答

下面是我怎么做的(有更多关于如何加载图像的信息):

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImagePanel extends JPanel{

    private BufferedImage image;

    public ImagePanel() {
       try {                
          image = ImageIO.read(new File("image name and path"));
       } catch (IOException ex) {
            // handle exception...
       }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, this); // see javadoc for more info on the parameters            
    }

}

不应该有任何问题(除了使用非常大的图像时可能遇到的任何一般性问题)。 如果您正在讨论将多个图像添加到单个面板,我会使用ImageIcons。对于单个图像,我会考虑创建JPanel的自定义子类,并覆盖其paintComponent方法来绘制图像。 (见2)

弗雷德·哈斯拉姆的方法很有效。但是我在文件路径上遇到了麻烦,因为我想引用jar中的图像。为了做到这一点,我使用:

BufferedImage wPic = ImageIO.read(this.getClass().getResource("snow.png"));
JLabel wIcon = new JLabel(new ImageIcon(wPic));

因为我只有有限的数量(大约10)的图像,我需要使用这种方法加载,它工作得很好。它不需要有正确的相对文件路径就可以获取文件。

在项目目录中创建一个源文件夹,在本例中我称之为Images。

JFrame snakeFrame = new JFrame();
snakeFrame.setBounds(100, 200, 800, 800);
snakeFrame.setVisible(true);
snakeFrame.add(new JLabel(new ImageIcon("Images/Snake.png")));
snakeFrame.pack();

通过使用来自免费SwingX库的JXImagePanel类,可以避免完全滚动自己的Component子类。

下载