【问题标题】:How to include and access images in a .jar如何在 .jar 中包含和访问图像
【发布时间】:2019-12-16 16:52:24
【问题描述】:

我想在 Eclipse 中将图像打包到一个可执行的 .jar 文件中,但即使在存储它们并链接到它们之后,它们似乎也没有出现。我正在尝试关注this guide,因为它似乎最接近我想要做的事情。

据我了解,我需要将 4 个图像文件中的每一个都作为 BufferredImage 从 InputStream 中读取,然后需要将它们改回常规图像,以便它们在 JavaFX 中正常工作。我已经尝试了很多变体,但是这个似乎效果最好的变体给了我一个 java.lang.reflect.InvocationTargetException,所以它甚至不能在 Eclipse 中正常工作。我知道有类似的问题,但似乎没有一个专门回答我的问题(大多数处理 ImageIcons 和 JFrames),或者我无法正确地将它们拼凑在一起。

public class CardPane extends Pane
{

    private static Image[] images;
    private static BufferedImage img1;
    private static BufferedImage img2;
    private static BufferedImage img3;
    private static BufferedImage img4;
    private static Image image1;
    private static Image image2;
    private static Image image3;
    private static Image image4;

    static
    {
        try {
            img1 = ImageIO.read(ResourceLoader.getImage("green-club-100.png"));
            img2 = ImageIO.read(ResourceLoader.getImage("pink-heart-100.png"));
            img3 = ImageIO.read(ResourceLoader.getImage("black-spade-100.png"));
            img4 = ImageIO.read(ResourceLoader.getImage("blue-diamond-100.png"));
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        image1 = SwingFXUtils.toFXImage(img1,null);
        image2 = SwingFXUtils.toFXImage(img2,null);
        image3 = SwingFXUtils.toFXImage(img3,null);
        image4 = SwingFXUtils.toFXImage(img4,null);
        images[0] = image1;
        images[1] = image2;
        images[2] = image3;
        images[3] = image4; 
    }
}

final public class ResourceLoader {

    public static InputStream getImage(String path) {
        InputStream input = ResourceLoader.class.getResourceAsStream(path);
        if (input == null)
            input = ResourceLoader.class.getResourceAsStream("/" + path);
        return input;
    }

}

Here is what it looks like on the file explorer.我将构建路径配置为将 res 文件夹标记为源文件夹,我相信这是我应该做的。

是否有快速解决方法来消除调用错误,或者我是否将整个事情完全错了?抱歉,如果这个问题令人困惑或看起来很愚蠢,我对编码和这个网站还很陌生。任何帮助将不胜感激,如果需要查看更多代码,我将很乐意分享!谢谢!

编辑:考虑到建议,我尝试了不同的方法,但似乎都不起作用。它们在 Eclipse 和我的计算机上运行良好,但在其他设备上打开 jar 时图像不会显示。 这是第一个资源加载器

private static Image[] images = new Image[4];
private static Image image1 = new Image(ResourceLoader.getImage("green-club-100.png"));
private static Image image2 = new Image(ResourceLoader.getImage("pink-heart-100.png"));
private static Image image3 = new Image(ResourceLoader.getImage("black-spade-100.png"));
private static Image image4 = new Image(ResourceLoader.getImage("blue-diamond-100.png"));

static
{
    images[0] = image1;
    images[1] = image2;
    images[2] = image3;
    images[3] = image4; 
}

第二个没有,使用example 2中的URL

public static URL url1 = CardGridPaneTest.class.getResource("green-club-100.png");
public static URL url2 = CardGridPaneTest.class.getResource("pink-heart-100.png");
public static URL url3 = CardGridPaneTest.class.getResource("black-spade-100.png");
public static URL url4 = CardGridPaneTest.class.getResource("blue-diamond-100.png");
public static Image image1 = new Image(url1.toString());
public static Image image2 = new Image(url2.toString());
public static Image image3 = new Image(url3.toString());
public static Image image4 = new Image(url4.toString());

public static Image[] images = new Image[4];
static {
images[0] = image1;
images[1] = image2;
images[2] = image3;
images[3] = image4;
}

【问题讨论】:

  • “据我了解,我需要将 4 个图像文件中的每一个作为 BufferredImage 从 InputStream 中读取,但随后需要将它们改回常规图像,以便它们在 JavaFX 中正常工作。 " 不是。 Image 提供a constructor taking InputStream 之外还有一个you could pass the resource url (converted to string) to
  • @fabian 我编辑了我的帖子,向您展示了我尝试实施您的建议的两种不同方式,但似乎都不起作用。当我在我的计算机上运行 jar 时它们出现,但当其他人试图从我的网站打开 jar 时却没有出现,这很奇怪吗?让我觉得东西仍在本地加载,或者完全有另一个错误。
  • 尝试从类路径根目录开始的资源路径:CardGridPaneTest.class.getResource("/green-club-100.png")。对于某些版本的 java,相对于类的路径对我停止工作......
  • 不走运:/ 不过感谢您的帮助。我发誓我已经尝试了所有方法并遵循了 Youtube/stackoverflow 示例,我真的不知道可能出了什么问题......
  • 您还可以尝试另一件事:将文件名和资源路径中的-s 替换为_s。根据以下文档,至少对于 java 8,您需要使用一个也是有效标识符的文件名:docs.oracle.com/javase/8/docs/technotes/guides/lang/…

标签: java eclipse image javafx jar


【解决方案1】:

代码很好。您收到该异常是因为您没有初始化图像数组。将图像定义为;

Image[] images = new Image[4]. 

【讨论】:

  • 谢谢,但没有运气。我仍然得到同样的错误。这确实解决了我的另一个失败尝试,但图像也没有出现在那个 .jar 中。
  • 你的应用程序有什么影响?图片是否存在于资源文件夹(src/main/resources)中?
  • 我添加了一张图片来显示文件在文件资源管理器窗口中的显示方式。我正在导出为可运行的 jar 文件,并将所需的库打包到 jar 中。
猜你喜欢
  • 2011-12-03
  • 2011-01-23
  • 2021-02-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 2014-10-05
  • 2014-03-06
相关资源
最近更新 更多