JavaFX显示SVG路径失败及ImageLoaderFactory不可访问问题求助
解决方案
1. rect标签转换为SVGPath无内容问题修复
你的代码首先存在一个明显的低级错误:读取rect属性生成路径对象后,下一行直接把svg变量覆盖为写死的测试矩形路径,这会导致你读取的SVG文件内的rect参数全部失效,测试矩形如果超出当前画布可视范围自然看不到内容,第一步先删除这行冗余的测试代码:
svg = svgGenerator.getShapeConverter().toSVG(new GeneralPath(new Rectangle(10,10,50,50)));
另外不建议依赖SVGGraphics2D做形状转路径的操作,依赖重且容易出现坐标偏移,你可以直接根据rect的属性手动拼接d属性字符串,性能更高也更可控,普通无圆角rect的拼接逻辑如下:
case "rect": double x = Double.parseDouble(a.getNamedItem("x").getNodeValue()); double y = Double.parseDouble(a.getNamedItem("y").getNodeValue()); double w = Double.parseDouble(a.getNamedItem("width").getNodeValue()); double h = Double.parseDouble(a.getNamedItem("height").getNodeValue()); // 处理可选的圆角属性 double rx = a.getNamedItem("rx") != null ? Double.parseDouble(a.getNamedItem("rx").getNodeValue()) : 0; double ry = a.getNamedItem("ry") != null ? Double.parseDouble(a.getNamedItem("ry").getNodeValue()) : 0; String d; if (rx <= 0 && ry <= 0) { // 无圆角矩形路径规则 d = String.format("M %.2f %.2f H %.2f V %.2f H %.2f Z", x, y, x + w, y + h, x); } else { // 带圆角的拼接逻辑可以自己补充,也可以直接用AWT的RoundRectangle2D生成路径后转字符串 RoundRectangle2D roundRect = new RoundRectangle2D.Double(x, y, w, h, rx, ry); Path2D path2d = new Path2D.Double(roundRect); d = SVGPathConverter.fromAwtPath(path2d); // 自行实现简单的AWT路径转SVG路径字符串逻辑即可 } path.setContent(d); break;
同时注意检查SVG的视口配置,如果路径坐标超出了父容器的viewBox范围也会出现看不到内容的问题。
2. ImageLoaderFactory导入权限报错问题修复
这个报错是Java 9+模块系统的限制导致的:com.sun.*开头的类都属于JavaFX的内部API,默认不对外开放访问权限,即使Maven引入了对应依赖,运行时也会限制访问。
解决方案分两种场景:
- 如果你是模块化项目(存在
module-info.java文件):
在module-info.java中添加导出配置,同时运行时添加JVM参数:--add-exports javafx.graphics/com.sun.javafx.iio=你的模块名 - 如果你是非模块化普通项目:
直接给运行配置添加JVM参数即可:--add-exports javafx.graphics/com.sun.javafx.iio=ALL-UNNAMED
注意:不建议直接使用JavaFX内部API,后续版本可能会无预警移除或修改,完全可以用成熟的第三方SVG处理方案替代自定义ImageLoaderFactory,比如用Batik库直接把SVG文件转成JavaFX的Image对象,或者直接用WebView加载SVG文件,不需要自己做底层解析。
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

