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

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

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

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

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


当前回答

我认为没有必要为任何东西创建子类。只需使用Jlabel。您可以将图像设置为Jlabel。因此,调整Jlabel的大小,然后用图像填充它。它的好。我就是这么做的。

其他回答

这个答案是对@shawalli的回答的补充…

我想在我的罐子里引用一个图像,但不是有一个BufferedImage,我简单地这样做:

 JPanel jPanel = new JPanel();      
 jPanel.add(new JLabel(new ImageIcon(getClass().getClassLoader().getResource("resource/images/polygon.jpg"))));

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

在项目目录中创建一个源文件夹,在本例中我称之为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();

如果您正在使用jpanel,那么您可能正在使用Swing。试试这个:

BufferedImage myPicture = ImageIO.read(new File("path-to-file"));
JLabel picLabel = new JLabel(new ImageIcon(myPicture));
add(picLabel);

图像现在是一个摆动组件。它像其他组件一样受到布局条件的制约。

你可以避免使用自己的组件和SwingX库和ImageIO类:

File f = new File("hello.jpg");
JLabel imgLabel = new JLabel(new ImageIcon(file.getName()));