向 JPanel 添加背景图片

7

我正在使用Java构建一个桌游。 对于游戏板本身,我尝试将该板的图像放置为整个JPanel的背景,该JPanel填充了JFrame。 我找到了一种方法来实现这一点,但是只能使用存储在本地的文件,它需要能够从GUI所在的包中获取该图像。

package Gui;

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

//Proof of concept for setting an image as background of JPanel

public class JBackgroundPanel extends JPanel {
    private BufferedImage img;

    public JBackgroundPanel() {
        // load the background image
        try {
            img = ImageIO.read(new File(
                    "C:\\Users\\Matthew\\Desktop\\5x5     Grid.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // paint the background image and scale it to fill the entire space
        g.drawImage(img, 0, 0, getWidth(), getHeight(), this);
    }
}

我看到使用ImageIcon是一种好的解决方法,但我不知道如何正确使用它。
编辑1 - 我在这里找到了答案http://www.coderanch.com/how-to/java/BackgroundImageOnJPanel。此外,我在我的工作空间中的图片格式不正确。感谢帮助。

3
如果您想要访问JAR文件中的图像,则需要将其作为资源进行访问,即使用以下代码:ImageIO.read(getClass().getResourceAsStream(resourcePath)); 资源路径将相对于您的类文件而定。建议您在此网站上搜索相关问题,因为这已经被问过很多次了。 - Hovercraft Full Of Eels
注意:ImageIcon不是“好的解决方案”。 - Hovercraft Full Of Eels
1个回答

6
  1. 确保你想要加载的资源位于Jar文件中
  2. 使用getClass().getResource("/path/to/resource")获取一个指向该资源的URL引用,该引用可以被ImageIO用来读取该资源

例如,如果图像位于你的Jar文件内的/images文件夹中,你可以使用以下代码:

 ImageIO.read(getClass().getResource("/images/5x5    Grid.jpg"));

例如...

2
没错,就是这样,1+。不过文件名中的空格让我感到有些不舒服。 - Hovercraft Full Of Eels
2
@HovercraftFullOfEels 是的,空格也让我感到不安。 - MadProgrammer
空格是错误的复制,文件名为5x5 Grid.gif,只有一个空格。 - Matthew G
现在我已经使用了你的例子,img = ImageIO.read(getClass().getResource("/images/5x5 Grid.jpg")); img 变成了一个 URL 类型,而 paintComponet 部分不能将 URL 作为参数。 - Matthew G
不,ImageIO 接受一个 URL(以及其他一些东西),读取图像并返回一个 BufferedImage。你可以绘制这个 BufferedImage - MadProgrammer

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