Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GUI因图像加载而不断崩溃?_Java_Image_Swing_Jframe_Awt - Fatal编程技术网

Java GUI因图像加载而不断崩溃?

Java GUI因图像加载而不断崩溃?,java,image,swing,jframe,awt,Java,Image,Swing,Jframe,Awt,我目前正在尝试为一个类创建一个游戏,我决定尝试加载GUI并显示一个背景图像 但是,我决定创建一个singleton ImageLoader类,该类具有一个HashMap,该HashMap缓存已经加载一次的图像,并存储和/或返回新的BuffereImage。其主要目的是为即将实施的多个敌军实体/导弹轻松有效地访问精灵 现在游戏类还没有完成,但它应该运行,它确实运行了!只是不像我预料的那样 我希望它运行并显示一个带有背景图像的GUI,但是GUI会在一瞬间出现,然后崩溃 这是游戏类(runGameLo

我目前正在尝试为一个类创建一个游戏,我决定尝试加载GUI并显示一个背景图像

但是,我决定创建一个singleton ImageLoader类,该类具有一个HashMap,该HashMap缓存已经加载一次的图像,并存储和/或返回新的BuffereImage。其主要目的是为即将实施的多个敌军实体/导弹轻松有效地访问精灵

现在游戏类还没有完成,但它应该运行,它确实运行了!只是不像我预料的那样

我希望它运行并显示一个带有背景图像的GUI,但是GUI会在一瞬间出现,然后崩溃

这是游戏类(runGameLoop方法中的图像绘制)

这是ImageLoader类

import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.HashMap;

import javax.imageio.ImageIO;


public class ImageLoader {

private HashMap<String,BufferedImage> storedImages = new HashMap<String,BufferedImage>();
private static ImageLoader single = new ImageLoader();

public static ImageLoader getImageLoader() {
    return single;
}

public BufferedImage getImage(String place) {
    BufferedImage image=null;
    if (storedImages.containsKey(place))
        return storedImages.get(place);
    else{
        try{
            URL location =  this.getClass().getClassLoader().getResource(place);
            if(location == null)
                System.exit(0);

            image = ImageIO.read(location);
        }
        catch(Exception e){
            System.out.println(e);
            System.exit(0);
        }

        storedImages.put(place,image);
        return storedImages.get(place);
    }
}


}
导入java.awt.image.buffereImage;
导入java.net.URL;
导入java.util.HashMap;
导入javax.imageio.imageio;
公共类图像加载器{
private HashMap storedImages=new HashMap();
私有静态ImageLoader single=新ImageLoader();
公共静态ImageLoader getImageLoader(){
返回单;
}
公共缓冲区映像getImage(字符串位置){
BuffereImage图像=空;
if(仓库尺寸、容器箱(位置))
返回storedImages.get(place);
否则{
试一试{
URL位置=this.getClass().getClassLoader().getResource(位置);
if(位置==null)
系统出口(0);
图像=图像读取(位置);
}
捕获(例外e){
系统输出打印ln(e);
系统出口(0);
}
存储尺寸。放置(位置、图像);
返回storedImages.get(place);
}
}
}

谢谢你的帮助!我对批评持开放态度。

您的图像应该与试图加载它们的类放在同一个包中。一个简单的修复方法是复制所有图像(如果您使用的是IDE),右键单击包,然后粘贴。只要使用图像文件名作为路径,即“mypic.png”,它就可以正常工作


编辑

所以我让它停止关机。我所做的就是改变这个

URL location =  this.getClass().getClassLoader().getResource(place);

唯一的问题是,这幅画不是画的。我不太清楚
Canvas
是如何工作的,它是AWT,我只是非常熟悉Swing,所以我将它改为
JPanel
并重写了
paintComponent
方法。并做了一些其他微妙的改变。你可以去看看。如果你有任何问题,请告诉我

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel {

    private JFrame frame;
    private BufferStrategy strat;
    private boolean stillPlaying;

    public Game() {
        frame = new JFrame("Pirate Game!");

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        frame.getContentPane().add(this);
        setIgnoreRepaint(true);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
        stillPlaying = true;
    }

    public static void main(String[] args) {
        Game g = new Game();
        g.runGameLoop();
    }

    private void runGameLoop() {
        long initLoop = System.currentTimeMillis();
        // while(stillPlaying){
        long change = initLoop - System.currentTimeMillis();
        initLoop = System.currentTimeMillis();
        //Graphics2D gfx = (Graphics2D) strat.getDrawGraphics();
        //BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
                //"stackoverflow.png");
        //gfx.drawImage(sourceImage, 0, 0, null);
        // }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
                "stackoverflow.png");
        g.drawImage(sourceImage, 0, 0, this);
    }

    public Dimension getPreferredSize() {
        return new Dimension(800, 600);
    }

}

如果您的
资源
位于
src
文件夹中,则另一种方法也会起作用。也许以前不是

那么您以前使用的代码片段就可以工作了

BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
                "resources/stackoverflow.png");


注意,在上面的场景中,当使用
getClass().getResource()
时,如果没有
classLoader()
,您的路径应该以
/

开始,我怀疑您的图像不是您认为的位置…崩溃是什么?例外?例外情况是什么,堆栈跟踪和堆栈跟踪所指的这些文件中的行……在您的捕获中,取出
System.exit
,并用
ex.printStackTrace()替换SOP。
查看您得到了什么,正如peeskillet所说,并删除了这两个System.exit。它最终给了我以下错误:java.lang.IllegalArgumentException:input==null!javax.imageio.imageio.read(未知源代码)com.apcsz.anish_danny.ImageLoader.getImage(ImageLoader.java:29)com.apcsz.anish_danny.Game.runGameLoop(Game.java:51)com.apcsz.anish_danny.Game.main(Game.java:42)因此,我假设我的图像不在正确的位置,但出于某种原因,即使我将它们移动到同一个目录,我也会遇到同样的问题,但仍然会出现同样的错误。我得到一个非法参数异常:input==null,尽管我不知道null作为参数来自何处。请从路径中删除
资源/
。我已经这样做了,感谢您迄今为止的所有帮助(仍然不起作用)您使用的IDE,以及您使用的完整包名。让我来测试一下。@Rycerub:另请参见for中引用的示例。
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Game extends JPanel {

    private JFrame frame;
    private BufferStrategy strat;
    private boolean stillPlaying;

    public Game() {
        frame = new JFrame("Pirate Game!");

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        frame.getContentPane().add(this);
        setIgnoreRepaint(true);
        frame.pack();
        frame.setResizable(false);
        frame.setVisible(true);
        stillPlaying = true;
    }

    public static void main(String[] args) {
        Game g = new Game();
        g.runGameLoop();
    }

    private void runGameLoop() {
        long initLoop = System.currentTimeMillis();
        // while(stillPlaying){
        long change = initLoop - System.currentTimeMillis();
        initLoop = System.currentTimeMillis();
        //Graphics2D gfx = (Graphics2D) strat.getDrawGraphics();
        //BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
                //"stackoverflow.png");
        //gfx.drawImage(sourceImage, 0, 0, null);
        // }
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
                "stackoverflow.png");
        g.drawImage(sourceImage, 0, 0, this);
    }

    public Dimension getPreferredSize() {
        return new Dimension(800, 600);
    }

}
BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
                "resources/stackoverflow.png");
URL location = this.getClass().getClassLoader().getResource(place);