使用 Apache Batik,
在向 DOM 添加新的 svg 元素后尝试更新(重新绘制)JSVGComponent。我知道 ALWAYS_DYNAMIC,这是确定的。新元素已成功添加到文档中,但我可以重新绘制组件的唯一方法是调整视图大小。调整大小后,新元素会弹出(出现)到位。我还尝试使用 UpdateManager 和 RunnableQueue 通过 Runnable 添加元素。同样,元素已成功添加,但直到调整组件大小(通过调整外壳框架大小)后才会出现。我还尝试通过 RunQ Runnable 调用重绘,但这也不起作用(实际上调用了重绘)。
我想我可能必须真正进入 GVT 桥,但我肯定不愿意。
非常感谢您的帮助。谢谢。
对我来说几乎同样的问题:我必须动态修改框的背景(多边形节点)。
根据 MelodyBibi 的说法,它可以与
setSVGDocument(doc);
一起使用,但 SVG 在刷新期间会闪烁。这不是很明显。
我的(更好的)解决方案是打电话
svgCanvas.getCanvasGraphicsNode().fireGraphicsNodeChangeCompleted();
在适当的节点上使用 polygonElement.setAttribute("fill", "red");
修改 DOM 模型后。
我还在第一次加载文档之前添加了
JSVGCanvas.ALWAYS_DYNAMIC
。
现在我的 SVG 会实时刷新,不会闪烁。
希望这对您有帮助。
你可以做
svgCanvas.setDocument(doc);
它适用于 JSVGCanvas,也许它也适合你。
您也可以尝试方法:
setSVGDocument(doc);
我发现了这个:
造成这种情况有两个常见原因。首先,JSVGCanvas 不知道它是动态文档。通常,Batik 通过查找脚本元素来检测这一点,但当您从 Java 修改文档时,它无法判断。因此,在加载文档之前调用
myJSVGCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
(使用 setURI、setDocument、setSVGDocument 等)。
第二个常见原因是更改不是在 UpdateManager 的线程中进行的。您可以使用以下命令在 UpdateManager 的线程中运行代码:
UpdateManager um = JSVGCanvas.getUpdateManager();
um.getUpdateRunnableQueue().invokeLater(Runnable);
注意:更新管理器仅在第一次渲染完成后才可用。当发生这种情况时,您可以通过注册 GVTTreeRendererListener 收到通知。
但我还没有尝试这个。