我的问题的背景 我正在使用netbeans IDE 7.1.2平台上的java swings创建一个Project windows m / c。然后我在linux m / c(cent os)中执行在windows m / c上创建的jar文件。 在我的项目的一部分,我需要在运行时显示一些图片。
问题陈述
案例1) 现在发生的事情是,在运行时我通过java代码执行cp(copy)命令将这些图片从其他位置带到我项目的src目录。 是的,我已经检查过这些图片是否已成功复制到src目录中。 之后,当我试图在标签中显示这些图像时,图片没有显示。
所以我想知道为什么会这样。
案例2) 在这个问题之后,我做了一个更改,然后我在项目的src文件夹中导入了这些图片,然后才清理和构建了#34; windows m / c上的项目,而不是在linux m / c上运行时将它们带到运行时间。之后,当我在linux m / c上执行jar文件时,图片显示在标签中。
因此,只有改变我做的是我在"清洁和建立"期间将图片包含在src目录中。我在windows m / c上的项目。 所以我不明白的是 为什么第一种情况下没有显示图片。
我的问题和疑惑 1)在文件和图片等资源(在项目中使用,而不是在这里讨论项目的源代码)的上下文中,创建jar文件时究竟发生了什么?在构建项目时,这些资源(文件和图片)是否也包含在jar中?
2)为什么我会遇到这样的问题?(我还检查了这些图像文件的权限。他们在两种情况下完全相同。)
任何人都能提供的任何见解都将深受赞赏。
答案 0 :(得分:1)
所以我假设你做了一些像
这样的事情label.setIcon(new ImageIcon("src/path/to/image"));
或
BufferdImage img = ImageIO.read(new File("src/path/to/image"));
或更糟,使用绝对文件引用...
Netbeans会在构建项目时将src目录的内容添加到生成的jar文件中(不包括源文件;)),这会改变这些资源需要处理的方式,你不能再对待了它们就像它们是文件系统上的文件一样。
一旦嵌入到您的应用程序上下文中(例如包含在您的jar文件中),它们就会变成通常所说的嵌入式资源。
相反,您需要根据需要使用Class#getResource或Class#getResourceAsStream,例如......
label.setIcon(new ImageIcon(getClass().getResource("path/to/image")));
更多详情后更新
Image im=newImageIcon(this.getClass().getResource("/home/aman/Desktop/diya.jpg")).getImage();
他的文件类型是错误的方法。这个文件是文件系统上的一个文件,而不是你应该使用更像......
的东西BufferedImage image = ImageIO.read(new File("/home/aman/Desktop/diya.jpg"));
jLabel1.setIcon(new ImageIcon(image));
注意,ImageIO.read
会抛出一个IOException
,它会被捕获,这对于诊断丢失的文件或错误的图像格式很有用
除非您之前更改了标签的可见性状态,否则无需拨打setVisible
,事实上,您无论如何都要设置标签隐藏......