java资源图片不显示

标签 java image swing resources gradle

我一直在尝试让图像资源显示在我正在开发的 GUI 上,但很难让它们显示。我遇到了有关加载资源的其他问题,例如 java-swing-displaying-images-from-within-a-jarimages-will-not-work-in-a-jar-file ,但它们对我不起作用。

我的问题似乎与第一个链接相同,其中图像在从 Eclipse 运行时出现,而在使用 Jars 从命令行运行时不出现。然而,这些问题的解决方案不会使图像出现。

我用于检索资源的代码是:

public class R {

    public static final String resourcePackage = "path/to/image/package";

    /**
     * Returns the resource string that refers to the <code>resource</code> file
     * in the <code>path.to.image.package.png</code> package.
     * 
     * @param resource
     *            the file in the <code>png</code> package
     * @return the full resource string
     */
    public static String png(String resource) {
        return String.format("%s/png/%s", resourcePackage, resource);
    }

    public static ResizableIcon resizableIcon(String resource) {
        return ImageWrapperResizableIcon.getIcon(R.class.getClassLoader()
            .getResourceAsStream(resource), new Dimension(48, 48));
    }
}

生成GUI时调用

JCommandButton connect = new JCommandButton(i18ln.getString("ports"),
                R.resizableIcon(R.png("serial-port-32x32.png")));

打印语句指示资源已找到,因为 R.class.getClassLoader().getResourceAsStream 返回 sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream< 的实例.

我被难住了。我花了几个小时试图解决这个问题,但需要一些帮助。有什么想法吗?

仅供引用:我认为这不重要,但我正在使用 Flamingo用于我的 GUI。

编辑:根据 Stefan 的要求

src/
    main/
        java/
            com.company.project (packages)
                R.java
                MyGui.java
        resources/
            com.company.project (packages)
                .png (package)
                    serial-port-32x32.png
                    (more images)
                .i18ln (package)
                    MyGui.properties

至于更多的代码,我不知道我还能提供什么对这个问题有很大帮助。上面提供了用于检索资源的所有代码以及我如何使用该代码。您是否正在寻找特定的东西?

更新:

当我使用 Eclipse 创建 Jar 并从命令行运行它时,图像资源可以正常显示。当我使用 Gradle 创建 Jar 时,图像不显示。因此,在生成允许通过 Eclipse Jar 而不是 Gradle Jar 正确访问图像资源的 Jar 时,做了一些不同的事情。我打开了a question on the Gradle forums with respect to this issue .

最佳答案

根据您的应用程序所在的环境(独立ApplicationServer),您将需要使用适当的 类加载器

如果你有一个工具类,Utils,你可以尝试这样的事情:

/* Returns a instance of InputStream for the resource */
public static InputStream getResourceAsStream(String resource) 
                                                   throws FileNotFoundException {
    String stripped = resource.startsWith("/")?resource.substring(1):resource;
    InputStream stream = null;
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    if (classLoader != null) {
        stream = classLoader.getResourceAsStream(stripped);
    }
    if (stream == null) {
        stream = Utils.class.getResourceAsStream(resource);
    }
    if (stream == null) {
        stream = Utils.class.getClassLoader().getResourceAsStream(stripped);
    }
    if (stream == null) {
        throw new FileNotFoundException("Resource not found: " + resource);
    }
    return stream;
}

使用:

Utils.getResourceAsStream("com/company/project/png/serial-port-32x32.png");

关于java资源图片不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10551772/

相关文章:

php - Laravel 图片库逻辑

r - 使用 PNG/JPEG 图像创建多面板图形

java - 如何使用 JTable 的行排序器恢复原始行顺序?

java - JComboBox的ActionListener并初始化JPanel

java - 为什么Java类只能扩展一个类却实现了很多接口(interface)?

java - 通过 Gmail API 发送带有纯文本回退的 HTML 电子邮件

java - 如何限制我的方法可见性

java - 获取字符串数组android中的项目位置?

Java 2D - 拖动鼠标平滑旋转图像

Java Swing Jbutton 访问另一个类中按下的按钮?