我很抱歉问这样一个初学者的问题,但是我无法让它工作,我也找不到答案。
我想在我的.jar文件中有一个图像并加载它。虽然这听起来很简单,但我只能在从IDE内部运行时加载图像,但在制作.jar之后不再能够加载图像(感谢谷歌我能够在.jar中获得.png)。这是我试过的:
BorderPane bpMain = new BorderPane();
String fs = File.separator;
Image imgManikin;
try {
imgManikin = new Image(
Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().toString()+"\\manikin.png");
bpMain.setBottom(new Label(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().toString()+"\\manikin.png"));
} catch (URISyntaxException e) {
imgManikin = new Image(
Main.class.getProtectionDomain().getCodeSource().getLocation().getPath()+"\\manikin.png");
System.out.println(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath()+"\\manikin.png");
bpMain.setBottom(new Label(Main.class.getProtectionDomain().getCodeSource().getLocation().getPath()+"\\manikin.png"));
}
//Image imgManikin = new Image("file:src\\manikin.png");
ImageView imgvBackground = new ImageView(imgManikin);
imgvBackground.setFitWidth(100);
imgvBackground.setPreserveRatio(true);
bpMain.setCenter(imgvBackground);
primaryStage.setTitle("Kagami");
primaryStage.setScene(new Scene(bpMain, 300, 275));
primaryStage.show();
不用说它没有用。它向我展示了底部的标签,其路径与预期的一样,但它的路径就像路径一样正确。 (我也尝试使用File.seperator
代替\\
甚至是/
,但我每次都得到相同的结果:它向我展示了路径但却没有加载图片。
我使用的是Windows 7,IDE是IntelliJ,我有最新的Java更新。
答案 0 :(得分:2)
如果jar文件位于应用程序的类路径中,并且要加载的图像位于jar文件的根目录下,则可以通过以下方式轻松加载图像:
URL url = getClass().getResource("/manikin.png");
BufferedImage awtImg = ImageIO.read(url);
Image fxImg = SwingFXUtils.toFxImage(awtImg, new Image());
Image fxImgDirect = new Image(url.openStream());
虽然ImageIO
返回BufferedImage
,但可以使用Image
将其转换为fx SwingUtils
。不过,首选方法是使用Image
中的InputStream
直接创建新的URL
个实例。
另见Load image from a file inside a project folder。如果完成,从jar文件或本地文件系统加载它无关紧要。
答案 1 :(得分:0)
Image::new(String)
构造函数正在寻找一个URL。可以在jar文件中构建资源的URL,但使用ClassLoader::getResource
或ClassLoader::getResourceAsStream
来管理它更容易。
鉴于文件结构:
src/
SO37054168/
GetResourceTest.java
example/
foo.txt
以下打包为jar将输出
package SO37054168;
public class GetResourceTest {
public static void main(String[] args) {
System.out.println(GetResourceTest.class.getClassLoader().getResource("example/foo.txt"));
System.out.println(GetResourceTest.class.getClassLoader().getResourceAsStream("example/foo.txt"));
}
}
JAR:文件:/home/jeffrey/Test.jar /example/foo.txt
sun.net.www.protocol.jar.JarURLConnection$JarURLInputStream@7f31245a
请注意资源的URL与您尝试构建的URL的不同。协议不同,您需要在jar文件的路径后面有!
。