题
当应用程序打包为Jar文件时,我该怎么做才能在JavaFX应用程序中加载资源?
背景
该应用程序是IntelliJ IDEA中的Maven项目。 …
这个问题有两个答案。
的 加载字体 强> 这只是我的一个错字,我在路径名中使用了错误的大写。有趣的是,这个拼写错误只是在运行jar文件时没有加载字体,当从IntelliJ运行应用程序时没关系。因此,您可以在jar中加载字体,如下所示:
Font.loadFont(Memory.class.getResourceAsStream("fonts/Font.ttf"), 20);
的 加载文件 强> 如果没有解决方法,从罐子里不知道他们的确切名称似乎是不可能的。您必须获得对jar文件本身的引用并枚举其条目。这在答案中有所描述 这个问题 那 阿迪 与他的评论相关联。
因此,我能够像这样加载我的图像:
List<String> imagePaths = getPaths("images"); List<Image> imagePool = new ArrayList<>(); for (int i = 0; i < imagePaths.size(); i++) { imagePool.add(new Image(imagePaths.get(i))); }
哪里 getPaths 是
getPaths
/** Returns the paths to all files in a folder. Useful for loading many files without knowing their names. * Importantly, this function will work whether or not the application is run from a jar or not. * However it might not work if the jar is not run locally. * * @param folderPath The relative path to the folder with no ending slash. * @return A List of path names to all files in that folder. * @throws IOException */ public static List<String> getPaths(String folderPath) throws IOException { final File jarFile = new File(Memory.class.getProtectionDomain().getCodeSource().getLocation().getPath()); List<String> filePaths = new ArrayList<>(); if(jarFile.isFile()) { // Run with JAR file final JarFile jar = new JarFile(jarFile); final Enumeration<JarEntry> entries = jar.entries(); //gives ALL entries in jar while(entries.hasMoreElements()) { final String name = entries.nextElement().getName(); if (name.startsWith(folderPath + "/")) { //filter according to the folderPath filePaths.add(name); } } jar.close(); } else { // Run with IDE final URL url = Memory.class.getResource("/" + folderPath); if (url != null) { try { final File apps = new File(url.toURI()); for (File app : apps.listFiles()) { filePaths.add(folderPath + "/" + app.getName()); } } catch (URISyntaxException ex) { // never happens } } } return filePaths; }
这与Adi所关联的问题的答案只有轻微的改变。