此问题已在此处有答案:
Get a list of resources from classpath directory(16个回答)
1小时前关闭
我试图从资源文件夹中设置JFX ImageView图像,但似乎无法获得不会引发异常的适当URL/String文件路径。
var x = getRandomImageFromPackage("pictures").toString();
var y = getClass().getClassLoader().getResource("pictures/mindwave/active/Super Saiyan.gif").toString();
this.iconImageView.setImage(new Image(x));
x
返回
/home/sarah/Desktop/Dropbox/School/Current/MAX MSP Utilities/MindWaveMobileDataServer/target/classes/pictures/0515e3b7cb30ac92ebfe729440870a5c.jpg
而y
返回的内容如下:
file:/home/sarah/Desktop/Dropbox/School/Current/MAX%20MSP%20Utilities/MindWaveMobileDataServer/target/classes/pictures/mindwave/active/Super%20Saiyan.gif
理论上,这两种情况都是可以接受的,但是,如果x被放置在下面的setImage(String)
行中,则只有x会抛出异常。
有没有办法得到包中的图像列表,以便我可以随机选择一个并设置ImageView?
我知道有一个自定义扫描仪选项,但它看起来相当过时(超过11岁,当时并没有真正支持):
常规:
/**
* Gets a picture from the classpath pictures folder.
*
* @param packageName The string path (in package format) to the classpath
* folder
* @return The random picture
*/
private Path getRandomImageFromPackage(String packageName) {
try {
var list = Arrays.asList(new File(Thread.currentThread().getContextClassLoader().getResource(packageName)
.toURI()).listFiles());
var x = list.get(new Random().nextInt(list.size())).toString();
return list.get(new Random().nextInt(list.size())).toPath();
} catch (URISyntaxException ex) {
throw new IllegalStateException("Encountered an error while trying to get a picture from the classpath"
+ "filesystem", ex);
}
}
作为参考,这是资源文件夹:
2条答案
按热度按时间mrwjdhj31#
您的方法问题
new Image(String url)以url作为参数。
空格不是URL的有效字符:
这就是为什么你的
x
字符串不是一个有效的URL,不能用于构造图像。请注意,它稍微复杂一些,因为从Image javadoc开始,url参数可以是直接url以外的东西,但即使如此,它们也不匹配您试图查找的内容。
如果一个URL字符串被传递给一个构造函数,它可以是以下任何一种:
1.可由该线程的上下文ClassLoader解析的资源的名称
1.可由文件解析的文件路径
1.可以通过URL解析且存在协议处理程序的URL
除了为应用程序注册的协议处理程序外,还支持URL的RFC 2397“数据”方案。如果URL使用“data”方案,则数据必须是base64编码的,并且MIME类型必须为空或图像类型的子类型。
如果你把你的资源打包到一个jar里,那么这将不起作用:
这不起作用,因为jar中的文件是使用
jar:
协议而不是file:
协议定位的。因此,您将无法从getResource返回的jar:
协议URI创建File对象。推荐方法:使用Spring
从jar中获取资源列表实际上是一件相当棘手的事情。从你链接的问题,最简单的解决方案是一个使用
不幸的是,这意味着需要依赖Spring框架才能使用它,这对于这项任务来说完全是多余的。. .... .然而,我不知道任何其他简单的鲁棒解决方案。但至少你可以只调用Spring实用程序类,你不需要启动整个Spring依赖注入容器来使用它,所以你根本不需要知道任何Spring或承受任何Spring开销。
所以,你可以写这样的东西(ResourceLister是我创建的一个类,以及toURL方法,请参阅示例应用程序):
可执行示例
放在src/main/resources/img中。
为JavaFX SDK安装设置VM参数:
ymdaylpp2#
没有简单可靠的方法来做到这一点。因此,我创建了一个清单文件并将其放入resources文件夹中。所以在运行时,我可以读取,然后有所有的文件名awailable,我需要的。
下面是一个小测试,展示了我如何创建该文件: