javafx - 从jar中加载图像

时间:2016-05-05 15:12:22

标签: java intellij-idea javafx

我很抱歉问这样一个初学者的问题,但是我无法让它工作,我也找不到答案。
我想在我的.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更新。

2 个答案:

答案 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::getResourceClassLoader::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文件的路径后面有!