java小游戏无法显示图片


package com.fjl;

import com.fjl.com.fjl.utils.GameUtils;

import javax.swing.*;
import java.awt.*;

/**
 * @author FJL
 * @version 1.0
 */
//窗口的创建
public class GameWin extends JFrame {
    public void launch() {
        //窗口是否可见
        this.setVisible(true);
        //窗口的大小
        this.setSize(600, 600);
        //窗口位置
        this.setLocationRelativeTo(null);
        //窗口标题
        this.setTitle("飞机大战");
    }

    //override paint method
    @Override
    public void print(Graphics g) {

        g.drawImage(GameUtils.background1, 0, 0, null);
    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();
    }
}

package com.fjl.com.fjl.utils;

import java.awt.*;

/**
 * @author FJL
 * @version 1.0
 */

public class GameUtils {
    // 背景图片添加
    public static Image background1 = Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
}


代码编译没问题,运行时只有窗口,里面没有插入的背景图片,我按照File-->Invalidate Cashes清除缓存重启均无效

参考GPT和自己的思路:根据您提供的代码,我看到您使用了Toolkit.getDefaultToolkit().getImage()方法加载背景图片。这种方式在加载较大的图片时可能会遇到问题,可能导致图片无法显示。我建议您使用ImageIO类加载图片。您可以尝试将以下代码添加到GameUtils类中,以加载背景图片:

public static Image background1;

static {
    try {
        background1 = ImageIO.read(new File("imgs/bg.jpg"));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

请确保您正确设置了背景图片的路径。如果仍然无法显示背景图片,请在控制台中查看是否有相关的错误信息。

参考GPT的回答

在Java中使用print()方法进行绘图通常是不被推荐的做法,因为它会覆盖掉窗口中原有的组件和内容,并且还可能导致一些性能问题。

建议您使用JPanel作为容器,在上面添加用于显示背景的JLabel组件。您可以将GameWin类改成以下形式:

java
package com.fjl;

import com.fjl.com.fjl.utils.GameUtils;

import javax.swing.*;
import java.awt.*;

/**
 * @author FJL
 * @version 1.0
 */
//窗口的创建
public class GameWin extends JFrame {

    public void launch() {
        //窗口是否可见
        this.setVisible(true);
        //窗口的大小
        this.setSize(600, 600);
        //窗口位置
        this.setLocationRelativeTo(null);
        //窗口标题
        this.setTitle("飞机大战");

        // 创建一个 JPanel 用于放置 JLabel 组件
        JPanel panel = new JPanel();
        // 设置背景图片
        panel.setBackground(new Color(255, 255, 255));
        panel.setLayout(null);  // 不使用任何布局管理器

        // 创建 JLabel,并设置其大小和位置,添加到 JPanel 中
        JLabel bgLabel = new JLabel(new ImageIcon(GameUtils.background1));
        bgLabel.setBounds(0, 0, 600, 600);
        panel.add(bgLabel);

        // 将 JPanel 添加到 JFrame 的内容面板中
        this.getContentPane().add(panel);
    }

    public static void main(String[] args) {
        GameWin gameWin = new GameWin();
        gameWin.launch();
    }
}

这样修改后,运行程序时就会在窗口中显示背景图片了。需要注意的是,在使用JPanel时需要手动设置布局管理器,或者直接使用null,否则可能会导致组件无法正确显示。