Apache Batik:如何在 SVG Dom 修改时强制 JSVGComponent 视图更新

问题描述 投票:0回答:2

使用 Apache Batik,

在向 DOM 添加新的 svg 元素后尝试更新(重新绘制)JSVGComponent。我知道 ALWAYS_DYNAMIC,这是确定的。新元素已成功添加到文档中,但我可以重新绘制组件的唯一方法是调整视图大小。调整大小后,新元素会弹出(出现)到位。我还尝试使用 UpdateManager 和 RunnableQueue 通过 Runnable 添加元素。同样,元素已成功添加,但直到调整组件大小(通过调整外壳框架大小)后才会出现。我还尝试通过 RunQ Runnable 调用重绘,但这也不起作用(实际上调用了重绘)。

我想我可能必须真正进入 GVT 桥,但我肯定不愿意。

非常感谢您的帮助。谢谢。

java svg batik
2个回答
1
投票

对我来说几乎同样的问题:我必须动态修改框的背景(多边形节点)。

根据 MelodyBibi 的说法,它可以与

setSVGDocument(doc);
一起使用,但 SVG 在刷新期间会闪烁。这不是很明显。

我的(更好的)解决方案是打电话

svgCanvas.getCanvasGraphicsNode().fireGraphicsNodeChangeCompleted();
在适当的节点上使用
polygonElement.setAttribute("fill", "red");
修改 DOM 模型后。

我还在第一次加载文档之前添加了

JSVGCanvas.ALWAYS_DYNAMIC

现在我的 SVG 会实时刷新,不会闪烁。

希望这对您有帮助。


0
投票

你可以做

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 收到通知。

但我还没有尝试这个。

© www.soinside.com 2019 - 2024. All rights reserved.