用 ImageIO 替换 ImageIcon 以加载图像

Substitute ImageIcon with ImageIO to load images

我正在使用 Eclipse 制作 java 游戏。当我导出到 运行 可用的 jar 并尝试 运行 不同计算机上的游戏时,图像不可见。在检查了网络和堆栈溢出的类似问题后,我认为这与我使用 ImageIcon 而不是 ImageIO 有关。但是,我不确定如何更改我的代码,以便我使用 ImageIO 而不是 ImageIcon 上传图像。

这里是使用ImageIcon加载图片的方法

void loadImage() {

    ImageIcon earth_image_icon = new ImageIcon("earth2.png");
    earth = earth_image_icon.getImage();

    ImageIcon sun_image_icon = new ImageIcon("sun2.png");
    sun = sun_image_icon.getImage(); 

    ImageIcon asteroid_image_icon = new ImageIcon("asteroid.png");
    asteroid = asteroid_image_icon.getImage();

    ImageIcon bg_image_icon = new ImageIcon("bg_pr.png");
    background = bg_image_icon.getImage();

    ImageIcon shipA_image_icon = new ImageIcon("ship_alpha.png");
    ship_on_asteroid = shipA_image_icon.getImage();

    ImageIcon ship_image_icon = new ImageIcon("ship_beta.png");
    ship_no_thrust = ship_image_icon.getImage();

    ImageIcon shipL_image_icon = new ImageIcon("ship_betaL.png");
    ship_left_thrust = shipL_image_icon.getImage();

    ImageIcon shipR_image_icon = new ImageIcon("ship_betaR.png");
    ship_right_thrust = shipR_image_icon.getImage();

    ImageIcon shipU_image_icon = new ImageIcon("ship_betaU.png");
    ship_up_thrust = shipU_image_icon.getImage();

    ImageIcon shipD_image_icon = new ImageIcon("ship_betaD.png");
    ship_down_thrust = shipD_image_icon.getImage();

    ImageIcon leftarrow_image_icon = new ImageIcon("leftarrow.png");
    leftarrow = leftarrow_image_icon.getImage();

    ImageIcon rightarrow_image_icon = new ImageIcon("rightarrow.png");
    rightarrow = rightarrow_image_icon.getImage();

    ImageIcon downarrow_image_icon = new ImageIcon("downarrow.png");
    downarrow = downarrow_image_icon.getImage();

    ImageIcon uparrow_image_icon = new ImageIcon("uparrow.png");
    uparrow = uparrow_image_icon.getImage();

}

这里以其中一种将图像绘制到 JPanel 上的方法为例

void drawEarth(Graphics g) {

    g.drawImage(earth, earth_x_coordinate, earth_y_coordinate, this);
    Toolkit.getDefaultToolkit().sync();
}

如何转换为使用 ImageIO?我已经查看了 Oracle 文档,但我在尝试整理它时迷路了,而且我对编程还很陌生,java。

更新 有人建议 this 可能是我的特定问题的解决方案,但我尝试了此 post 上给出的答案,但他们没有为我的案子工作。

您需要在编译的 jar 中包含图像资源。如果您使用的是像 eclipse 这样的 IDE,一个简单的方法是创建一个 resimg 文件夹并将您的文件放在那里。 (使用给出的方法here。)

在那种情况下,您可能不需要使用 ImageIO。但是,如果您仍然想使用 ImageIO(推荐使用它,因为它对格式的更广泛支持和更好的异常处理,如评论中所述),您可以执行以下操作:

Icon foo = new ImageIcon(ImageIO.read(getClass().getResource("foo.png")))

我在 eclipse 中创建了一个新项目,并将 class 文件复制到新项目的 src 文件夹中。然后我创建了一个资源文件夹,将其添加到构建路径,在该资源文件夹中创建了一个图像包并将图像复制到该图像包中。出于某种原因,这一切都奏效了。感谢大家的帮助