Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java资源图像不显示_Java_Image_Swing_Resources_Gradle - Fatal编程技术网

java资源图像不显示

java资源图像不显示,java,image,swing,resources,gradle,Java,Image,Swing,Resources,Gradle,我一直在尝试让图像资源显示在我正在开发的GUI上,但我很难让它们显示出来。我遇到了其他关于加载资源的问题,例如和,但它们对我不起作用 我的问题似乎与第一个链接相同,其中图像在从Eclipse运行时显示,在使用JAR从命令行运行时不显示。然而,这些问题的解决方案并不会使图像出现 我用于检索资源的代码是: public class R { public static final String resourcePackage = "path/to/image/package"; /

我一直在尝试让图像资源显示在我正在开发的GUI上,但我很难让它们显示出来。我遇到了其他关于加载资源的问题,例如和,但它们对我不起作用

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

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

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")));
print语句表明找到该资源是因为
R.class.getClassLoader().getResourceAsStream
返回
sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream
的实例

我被难住了。我花了几个小时试图弄明白这一点,但可能需要一些帮助。有什么想法吗

仅供参考:我不认为这有什么关系,但我正在使用我的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 src/ 主要/ 爪哇/ com.company.project(包) R.java MyGui.java 资源/ com.company.project(包) .png(包) 串口-32x32.png (更多图片) .i18ln(包装) MyGui.properties 至于更多的代码,我不知道我还能提供什么对这个问题有很大好处。上面提供了检索资源的所有代码以及如何使用这些代码。你在找什么特别的东西吗

更新:


当我使用Eclipse创建一个Jar并从命令行运行它时,图像资源会正确显示。当我使用Gradle创建Jar时,图像不会显示。因此,在生成Jar时,可以通过EclipseJAR(而不是GradleJAR)正确访问图像资源,这是一种不同的做法。我打开了。

创建一个资源包,并将该类和您的图像放在其中:

public final class Resources {

    public static ImageIcon getImage(String filename) {
        URL resourceUrl = Resources.class.getResource(filename);
        return new ImageIcon(resourceUrl);
    }
}
编辑:

我已经用maven和flamingo(使用您的R类)重建了您的结构,它可以与以下添加一起工作:

更改:

R.class.getClassLoader().getResourceAsStream(resource);
致:

我已经使用maven assemble插件来构建jar,如前所述。

这里试试这个例子。希望这能为你解释一些事情

不要使用类加载器,正如本文所述,其中的一段引语指出:“所有类加载器将首先搜索作为系统资源的资源,搜索方式类似于搜索类文件。”

取决于应用程序所在的环境(独立,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");

忘记类装入器,检查路径。如果可行,请使用getResource i.o.getResourceAsStream(风格问题:更直接,未找到时传递null)

由于getResource(AsStream)是基于类的,因此路径是相对的,请尝试以下操作:

R.class.getResource("/" + resource)

使用此图像“myPicture”作为ImageWrapperResizeableIcon.getIcon方法的第一个参数

您是否检查了图像是否确实在罐子中。@E-rich:在使用
Eclipse
时,您是否制作了一个
源文件夹
以将图像放入其中,如果没有,请查看我的答案,这可能会指导您完成它。从Eclipse运行时会显示图像,但不会从Eclipse外部显示图像。您可以发布更多的代码和项目结构吗?添加了“我的项目结构”。我不知道我还能为这个问题提供什么代码;没有为检索图像资源调用任何其他内容。通过
ResourceBundle.getBundle(“com.company.project.i18ln.MyGui”)
访问localization.properties文件,它工作正常。
src/main/java
src/main/resources
都是Eclipse中的源文件夹。在Eclipse中一切都很好;问题是在我把所有东西都震碎并从命令行运行之后。.java文件和所有资源文件都包含在.jar文件中,但图像却没有显示。是的,这是它们所在位置的原因,这就是为什么要遵循我在该链接中告诉您的步骤,这样您就可以运行包含图像的.jar。在Eclipse中,src不是您的
源文件夹
您自己为
应用程序资源
创建它,并使用正斜杠访问它们
/
我收到一个
javax.imageio.IIOException:读取PNG图像数据时出错。我无法找到关于该错误的很多有用信息。您确定已按照步骤进行了操作吗?如果执行了,则可以在运行后看到放置在
源文件夹
中的内容也被复制到bin文件夹中。您正在执行
Image Image=ImageIO.read(getClass().getResource(“/Image/yourmage.extension”)
其中image是您在源文件夹中创建的文件夹
它们位于Eclipse创建的bin文件夹中,但这不是问题所在。问题是,一旦应用程序安装好并在Eclipse之外运行,就要显示图像资源。是的,我正在做你在评论中的建议。尽管如此,我很确定当资源在一个罐子里时解决方案会失败(根据我遇到的许多其他帖子)。在Eclipse中工作,而不是从命令行。从命令行返回一个
sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream
实例。但随后它抛出了一个
javax.imageio.IIOException:Error reading PNG image data
javax.imageio.IIOException:Error reading PNG image data
不是根本原因。
R.class.getResource("/" + resource)
URL imageurl = getClass().getResource("/images/serial-port-32x32.png");//relative path of the image as argument 
Image myPicture = Toolkit.getDefaultToolkit().getImage(imageurl);