【问题标题】:Java, Accessing a image in a resource folder in eclipseJava,在eclipse中访问资源文件夹中的图像
【发布时间】:2014-12-20 23:44:45
【问题描述】:

我有一个应该加载缓冲图像的类,但无论我将图像保存在 Eclipse 中的哪个位置或我的计算机上,我都无法访问它。这里是类

package com.m14x.game;

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;

public class BufferedImageLoader {

    private BufferedImage image;

    public BufferedImage loadImage(String path) throws IOException{

        System.out.println(getClass());

        image = ImageIO.read(getClass().getResource(path));
        return image;``
    }
}

这是我得到错误的主要课程

package com.m14x.game;

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import com.m14x.game.BufferedImageLoader;
import com.m14x.game.SpriteSheet;

public class Game extends Canvas implements Runnable {

    private static final long serialVersionUID = 1L;
    public static final int WIDTH = 320;
    public static final int HEIGHT = WIDTH / 12 * 9;
    public static final int SCALE = 3;
    public static String TITLE = "2D Space Game";

    private boolean running = false;
    private Thread thread;

    private BufferedImage image = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB);
    private BufferedImage spriteSheet = null;

    // temp
    private BufferedImage player;

    public void init() {

        BufferedImageLoader loader = new BufferedImageLoader();
        try {

            spriteSheet = loader.loadImage("/sprite_sheet.png");

        } catch (Exception e) {
            e.printStackTrace();
        }

        System.out.println("7");
        SpriteSheet ss = new SpriteSheet(spriteSheet);
        player = ss.grabImage(1, 1, 32, 32);
    }

    public void run() {
        init();

        long lastTime = System.nanoTime();
        final double AMOUNT_OF_TICKS = 60.0;
        double ns = 1000000000 / AMOUNT_OF_TICKS;
        double delta = 0;
        int updates = 0;
        int frames = 0;
        long timer = System.currentTimeMillis();        
        while (running) {

            long now = System.nanoTime();
            delta += (now - lastTime) / ns;
            lastTime = now;

            if (delta >= 1) {
                tick();
                updates++;
                delta -= 1;
            }
            render();
            frames++;

            if (System.currentTimeMillis() - timer > 1000) {
                timer += 1000;
                System.out.println("Frames: " + frames + ", Ticks: " + updates);
                updates = 0;
                frames = 0;
            }
        }
        stop();
    }

    private void tick() {
    }

    private void render() {

        BufferStrategy bs = this.getBufferStrategy();

        if (bs == null) {
            createBufferStrategy(3);
            return;
        }

        Graphics g = bs.getDrawGraphics();
        // //////// DRAW THINGS BELOW ///////////

        g.drawImage(image, 0, 0, getWidth(), getHeight(), this);

        g.drawImage(player, 100, 100, this);

        // //////// DRAW THINGS ABOVE ///////////
        g.dispose();
        bs.show();
    }

    private synchronized void start() {
        if (running) {
            System.out.println("Did not start, already running!");
            return;
        } else {
            System.out.println("Now running the thread!");
            running = true;
            thread = new Thread(this);
            thread.start();
        }
    }

    private synchronized void stop() {
        if (!running) {
            return;
        } else {
            running = false;
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.exit(1);
        }
    }

    public static void main(String[] args) {

        Game game = new Game();

        game.setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        game.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
        game.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));

        JFrame frame = new JFrame(Game.TITLE);
        frame.add(game);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

        game.start();
    }
}

但是当我尝试使用它时> spriteSheet = loader.loadImage("sprite_sheet.png");

我得到一个 nullPointer 异常。 我一直在寻找答案,但我发现的答案都没有。

这是我得到的确切错误;

java.lang.IllegalArgumentException: input == null!
    at javax.imageio.ImageIO.read(Unknown Source)
    at com.m14x.game.BufferedImageLoader.loadImage(BufferedImageLoader.java:19)
    at com.m14x.game.Game.init(Game.java:34)
    at com.m14x.game.Game.run(Game.java:46)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "Thread-2" java.lang.NullPointerException
    at com.m14x.game.SpriteSheet.grabImage(SpriteSheet.java:15)
    at com.m14x.game.Game.init(Game.java:42)
    at com.m14x.game.Game.run(Game.java:46)
    at java.lang.Thread.run(Unknown Source)

这也是我的项目结构;

-src
--com
---m14x
----game
-----BufferedImageLoader.java
-----Game.java
-----SpriteSheet.java
--res
---sprite_sheet.png

【问题讨论】:

  • NullPointerException 实际出现在哪里?
  • 线程运行时

标签: java eclipse image file


【解决方案1】:

您必须在 jar 文件中提供文件的绝对路径(必须以 / 开头),例如:

/packageInsideResources/sprite_sheet.png

也可以试试getResourceAsStream():

InputStream is = getClass.getResourceAsStream("/packageInsideResources/sprite_sheet.png");
BufferedImage image = ImageIO.read(is);

我在getResource() 上遇到过几次问题。

【讨论】:

  • 它仍然无法正常工作。这是我得到的确切错误。
  • 能否发布您的项目结构,例如您的文件在 src 文件夹中的位置?还是您专门为资源使用不同的文件夹?
  • 您也可以编辑您的帖子并添加您刚刚向我显示的错误。
  • 对不起,这是我第一次访问这个网站,有什么方法可以轻松上传我的项目结构吗?
  • 打印出来,或者直接打出来。
【解决方案2】:

您将资源文件夹放在源文件夹中。这是不好的做法。将资源文件夹放在源文件夹之外。

-src
--com
---m14x
----game
-----BufferedImageLoader.java
-----Game.java
-----SpriteSheet.java
-res
---sprite_sheet.png

将资源文件夹添加到类路径。然后你可以使用这一行:

spriteSheet = loader.loadImage("/sprite_sheet.png");

不要忘记在开始时添加/

【讨论】:

  • 当我这样做时,我不再收到错误,但代码仍然不起作用。
  • 加倍努力。我已经在我的电脑上完成了这个,它对我有用。
【解决方案3】:

我想这可能已经在不同的线程上得到了回答,但由于我是 Java 和 Eclipse 的新手(2 周),我认为我会很善良并给出一个事实上的答案。

与其他 IDE 不同,Eclipse 喜欢控制一切,因此您必须告诉它要将哪个目录用作资源,然后将所有文件分别放在资源目录中。这一切都是通过 Project Explorer 完成的。首先,创建文件夹资源(新建 -> 文件夹),然后在该文件夹中创建每个文件资源。幸运的是,对于文件夹和文件,它们都可以链接到外部位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多