java - 如何在 .jar 中包含和访问图像

标签 java eclipse image javafx jar

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

根据我的理解,我需要从 InputStream 中将 4 个图像文件中的每一个作为 BufferredImage 读取,然后需要将它们更改回常规图像,以便它们在 JavaFX 中正常工作。我尝试了很多变体,但是这个似乎效果最好的一个是给了我一个 java.lang.reflect.InitationTargetException ,所以它甚至不能在 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; 
}

第二个没有,使用 URL,如 example 2

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;
}

最佳答案

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

Image[] images = new Image[4]. 

关于java - 如何在 .jar 中包含和访问图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57421713/

相关文章:

java - 需要对此代码进行一些修改。

java - 从 Java 中的参数化类(Apache CXF、Axis2)生成 Web 服务(WSDL 1.2 或更高版本)

java - 运行logback源码示例,IDEA提示找不到类GafferConfigurator

java - Eclipse:导航到先前访问的文件

HTML div 宽度适合图像

java - 将月份添加到特定的 java.sql.Date 日期

eclipse 的数据库访问插件

java - Lotus Notes - Java UI - Eclipse 插件

html - 将 html 图形宽度设置为其包含的图像宽度相同

image - 二值化图像中的单独交叉线段