java资源图像不显示
我一直在尝试让图像资源显示在我正在开发的GUI上,但我很难让它们显示出来。我遇到了其他关于加载资源的问题,例如和,但它们对我不起作用 我的问题似乎与第一个链接相同,其中图像在从Eclipse运行时显示,在使用JAR从命令行运行时不显示。然而,这些问题的解决方案并不会使图像出现 我用于检索资源的代码是: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"; /
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);