在添加title图标时,javafx报错
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
报错代码如下:
public void start(Stage stage) throws Exception {
stage.setTitle("JavaFx App");
stage.getIcons().add(new Image("resource/image/test.png"));
stage.show();
}
查看报错代码
显示指定资源为空时,报错找不到资源区文件
说明根本就没找到我们的图片文件
所以我们选择跟Image方法,查看他是如何从我们的url中提取的路径
public Image(@NamedArg("url") String url) {
this(validateUrl(url), null, 0, 0, false, false, false);
initialize(null);
}
跟回到了报错的validateUrl()方法
private static String validateUrl(final String url) {
if (url == null) {
throw new NullPointerException("URL must not be null");
}
if (url.trim().isEmpty()) {
throw new IllegalArgumentException("URL must not be empty");
}
try {
if (!URL_QUICKMATCH.matcher(url).matches()) {
final ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
URL resource;
if (url.charAt(0) == '/') {
resource = contextClassLoader.getResource(url.substring(1));
} else {
resource = contextClassLoader.getResource(url);
}
if (resource == null) {
throw new IllegalArgumentException("Invalid URL or resource not found");
}
return resource.toString();
}
// Use URL constructor for validation
return new URL(url).toString();
} catch (final IllegalArgumentException e) {
throw new IllegalArgumentException(
constructDetailedExceptionMessage("Invalid URL", e), e);
} catch (final MalformedURLException e) {
throw new IllegalArgumentException(
constructDetailedExceptionMessage("Invalid URL", e), e);
}
}
由代码可知:
image方法调用http的远程图片可以直接加载成功
但是本地文件无法加载
所以最后选择使用file协议进行加载
所以最终解决办法为
stage.getIcons().add(new Image("file:resource/image/test.png"));