0

我有一个以前从未遇到过的问题,并且无法在网上找到解决方案。我有一个小程序,它使用一些图像来打印菜单。

这是我用来打印图像的类:

public class ViewImage extends JPanel {
    private static final long serialVersionUID = 1L;
    protected Image image = null;

    public ViewImage(int x, int y, String path) {
        this(x, y, new ImageIcon(path).getImage());
    }

    public ViewImage(int x, int y, Image image) {
        this.image = image;
        this.setBounds(x, y, image.getWidth(null), image.getHeight(null));
    }

    public void paintComponent(Graphics g) {
        int x = ((this.getWidth() - image.getWidth(null)) / 2);
        int y = ((this.getHeight() - image.getHeight(null)) / 2);

        g.drawImage(image, x, y, null);
    }

    public void setImage(String path) {
        this.image = new ImageIcon(path).getImage();
    }
 }

我的图像都是类路径的一部分,我称之为:

this.getClass().getClassLoader().getResource("MyImage.png").getPath()

工作正常,直到我将我的程序打包成一个 jar 文件并从控制台运行它:

java -jar MyJar.jar

我的程序启动良好,但没有打印图像。没有异常,没有错误,什么都没有。

什么会导致这种行为?

4

2 回答 2

4

首先确保您的资源已正确加载(例如使用 System.out())!

而是ImageIcon(String location)使用ImageIcon(URL location)构造函数,因为您的图像不在硬盘上,而是在您的类路径中作为 URL 实时压缩(类似于 MyJar.jar!/path/to/image.png");您必须将图像加载修改为

this.getClass().getClassLoader().getResource("MyImage.png");
于 2013-08-15T09:59:21.647 回答
1

代码的“.getPath()”部分不包括 URL 的前导部分。
如果您的资源是 jar 文件的一部分,则需要提供此信息。

我建议您删除“.getPath()”并使用完整的 URL。
打印出完整的 URL 也是一个好主意,例如在 System.out.println 中。

于 2013-08-15T10:19:31.943 回答