在java中将图像加载到背景中

在java中将图像加载到背景中,java,jframe,jpanel,Java,Jframe,Jpanel,在Java中如何将图像加载到背景中?我尝试过许多不同的方法,但都不管用,所以我想问是否有人知道如何将png图像上传到JPanel中,制作自己的JPanel。在GUI的构造函数中添加PicPanel的对象 class PicPanel extends JPanel{ private BufferedImage image; private int w,h; public PicPanel(String fname){ //Pass picture's filename a

在Java中如何将图像加载到背景中?我尝试过许多不同的方法,但都不管用,所以我想问是否有人知道如何将png图像上传到JPanel中,制作自己的JPanel。在GUI的构造函数中添加PicPanel的对象

class PicPanel extends JPanel{

    private BufferedImage image;
    private int w,h;
    public PicPanel(String fname){ //Pass picture's filename as a parameter.

        //reads the image
        try {
            image = ImageIO.read(getClass().getResource("/"+fname));
            w = image.getWidth();
            h = image.getHeight();

        } catch (IOException ioe) {
            System.out.println("Could not read in the pic");
            //System.exit(0);
        }

    }

    public Dimension getPreferredSize() {
        return new Dimension(w,h);
    }
    //this will draw the image
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawImage(image,0,0,this);
    }
}

有许多方法可以实现这一点

你可以。。。 创建一个
JLabel
,将图像应用于其
图标
属性,并将其设置为框架内容窗格。然后需要适当地设置布局管理器,因为
JLabel
没有默认的布局管理器

JFrame frame = ...;
JLabel background = new JLabel(new ImageIcon(ImageIO.read(...)));
frame.setContentPane(background);
frame.setLayout(...);
frame.add(...);
问题是调整帧大小时,
JLabel
不会调整图像大小

你可以。。。 创建一个自定义组件,从
JPanel
扩展,并覆盖它的
paintComponent
方法,根据需要绘制背景

这使您能够在图像的可用空间发生变化时,决定如何最佳地缩放图像。虽然有很多方法可以实现这一点,但你应该通读一遍,了解它们的优缺点

这就提出了一系列新的问题,你想扩展它们并保持纵横比吗?如果是这样的话,您希望将图像适配到可用区域还是填充它(这样它将始终覆盖可用空间)

请查看以了解更多详细信息

其他注意事项

图像通常最好通过
ImageIO
API加载,因为它能够加载范围广泛的图像,但在出现问题时也会抛出
IOException

有关更多详细信息,请参阅


图像的位置也很重要。如果映像位于应用程序外部(文件系统上的某个位置),则可以使用
ImageIO.read(新文件(“/path/to/image”)
。但是,如果图像嵌入到应用程序中(例如存储在Jar中),则需要使用类似于
ImageIO.read(getClass().getResource(“/path/to/image”))
的东西,而不是…

发布所有您尝试过的东西的代码。这是之前提出的问题:虽然这肯定会起作用,如果你什么也不做,只是画图像,那么一个
JLabel
会更简单…只是说…这就是我的编程老师做的…这就是我做的…到目前为止效果很好:-)那么你的编程老师需要一些新的课程;)-在两行中,我可以做你们全班都做过的事情,但你们刚才说:“问题是,当调整帧的大小时,JLabel不会调整图像的大小”,所以你们为什么推荐这样做?是的!解释你自己!D: