添加新元素后 JSVGCanvas 不更新图形
JSVGCanvas does not update the graphic after new elements being added
使用:Apache batik (SVG)、NetBeans IDE、NetBeans 平台,Java
我有一个应用程序,其中包含使用 batik 和 JSVGCanvas 组件显示的 SVG。
我还调用了svg.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
这是 SVG 文件:
<svg width="500" height="400" viewBox="0 0 250 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="hi" style="color:black; stroke:currentColor; stroke-width:0.4;">
<g id="ks">
<text id="textX" x="0" y="5" style="font-family:Arial; font-size:4.00pt; text-anchor:start">100%</text>
<text id="textY" x="5" y="105" style="font-family:Arial; font-size:4.00pt; text-anchor:start">0%</text>
</g>
</g>
这个简单的 SVG 像现在一样第一次显示在应用程序中。现在我从应用程序获得了新的输入,需要将新的元素添加到 SVG 文档中。
我正在使用从 JSVGCanvas 获得的 SVGDocument 执行此操作。
这是一个例子:
Runnable run = new Runnable()
{
@Override
public void run()
{
Element elementById = SVGUtilities.getElementById(svgDocument, "g", "hi");
Element createElement = svgDocument.createElement("g");
createElement.setAttribute("id", "myID");
Element rect = SVGUtilities.createRect(
svgDocument, String.valueOf(xValue), yValue, String.valueOf(BARWIDTH),
String.valueOf(barHeight), color);
createElement.appendChild(rect);
elementById.appendChild(createElement);
}
};
为了执行更改,我现在将这些行包装在一个 Runnable 中并将其放入 UpdateManager 队列中。
RunnableQueue updateRunnableQueue = updateManager.getUpdateRunnableQueue();
updateRunnableQueue.invokeAndWait(run);
((JSVGCanvas)canvas).setSVGDocument((SVGDocument)doc);
JSVGCanvas 不更新图形。
一些附加信息:
- 我也试过 invokeLater(运行);这也行不通
- 我不更改文件,只更改 SVGDocument。所以我不将更改写入文件。我只是更改 "Document" 实例。
- 我将文档实例打印到控制台进行日志记录,结果正是我想要的,因此文档确实包含正确的新元素。
控制台中 SVG 的结果是:
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" width="500" zoomAndPan="magnify" contentStyleType="text/css" viewBox="0 0 250 200" height="400" preserveAspectRatio="xMidYMid meet" version="1.0">
<g style="color:black; stroke:currentColor; stroke-width:0.4;" id="hi">
<g id="ks">
<text x="0" id="textX" y="5" style="font-family:Arial; font-size:4.00pt; text-anchor:start">100%</text>
<text x="5" id="textY" y="105" style="font-family:Arial; font-size:4.00pt; text-anchor:start">0%</text>
</g>
<g id="25.0">
<rect x="20.0" width="20.0" y="5.0" height="7.142857142857142" style="fill:#ff0000"/>
</g>
</g>
你知道为什么我的图片没有更新吗?我搜索了几天,但我的更改(UpdateManager Queue、setSVGDocument 等)不起作用。我现在不知道该怎么办...
提前谢谢你。
您好
托拜厄斯
必须在 SVG 命名空间中创建 SVG 元素。因此它们不能使用 createElement 创建,必须使用 createElementNS
创建
Element createElement = svgDocument.createElement("g");
不正确,需要这样写...
Element createElement = svgDocument.createElementNS(SVGDOMImplementation.SVG_NAMESPACE_URI, "g");
我不确定 SVGUtilities 的作用,因为您没有提供该实现,但这也可能是错误的。
使用:Apache batik (SVG)、NetBeans IDE、NetBeans 平台,Java
我有一个应用程序,其中包含使用 batik 和 JSVGCanvas 组件显示的 SVG。
我还调用了svg.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
这是 SVG 文件:
<svg width="500" height="400" viewBox="0 0 250 200" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="hi" style="color:black; stroke:currentColor; stroke-width:0.4;">
<g id="ks">
<text id="textX" x="0" y="5" style="font-family:Arial; font-size:4.00pt; text-anchor:start">100%</text>
<text id="textY" x="5" y="105" style="font-family:Arial; font-size:4.00pt; text-anchor:start">0%</text>
</g>
</g>
这个简单的 SVG 像现在一样第一次显示在应用程序中。现在我从应用程序获得了新的输入,需要将新的元素添加到 SVG 文档中。 我正在使用从 JSVGCanvas 获得的 SVGDocument 执行此操作。 这是一个例子:
Runnable run = new Runnable()
{
@Override
public void run()
{
Element elementById = SVGUtilities.getElementById(svgDocument, "g", "hi");
Element createElement = svgDocument.createElement("g");
createElement.setAttribute("id", "myID");
Element rect = SVGUtilities.createRect(
svgDocument, String.valueOf(xValue), yValue, String.valueOf(BARWIDTH),
String.valueOf(barHeight), color);
createElement.appendChild(rect);
elementById.appendChild(createElement);
}
};
为了执行更改,我现在将这些行包装在一个 Runnable 中并将其放入 UpdateManager 队列中。
RunnableQueue updateRunnableQueue = updateManager.getUpdateRunnableQueue();
updateRunnableQueue.invokeAndWait(run);
((JSVGCanvas)canvas).setSVGDocument((SVGDocument)doc);
JSVGCanvas 不更新图形。
一些附加信息:
- 我也试过 invokeLater(运行);这也行不通
- 我不更改文件,只更改 SVGDocument。所以我不将更改写入文件。我只是更改 "Document" 实例。
- 我将文档实例打印到控制台进行日志记录,结果正是我想要的,因此文档确实包含正确的新元素。
控制台中 SVG 的结果是:
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" width="500" zoomAndPan="magnify" contentStyleType="text/css" viewBox="0 0 250 200" height="400" preserveAspectRatio="xMidYMid meet" version="1.0">
<g style="color:black; stroke:currentColor; stroke-width:0.4;" id="hi">
<g id="ks">
<text x="0" id="textX" y="5" style="font-family:Arial; font-size:4.00pt; text-anchor:start">100%</text>
<text x="5" id="textY" y="105" style="font-family:Arial; font-size:4.00pt; text-anchor:start">0%</text>
</g>
<g id="25.0">
<rect x="20.0" width="20.0" y="5.0" height="7.142857142857142" style="fill:#ff0000"/>
</g>
</g>
你知道为什么我的图片没有更新吗?我搜索了几天,但我的更改(UpdateManager Queue、setSVGDocument 等)不起作用。我现在不知道该怎么办...
提前谢谢你。
您好 托拜厄斯
必须在 SVG 命名空间中创建 SVG 元素。因此它们不能使用 createElement 创建,必须使用 createElementNS
创建Element createElement = svgDocument.createElement("g");
不正确,需要这样写...
Element createElement = svgDocument.createElementNS(SVGDOMImplementation.SVG_NAMESPACE_URI, "g");
我不确定 SVGUtilities 的作用,因为您没有提供该实现,但这也可能是错误的。