添加新元素后,JSVGCanvas不会更新图形

时间:2016-04-20 11:32:31

标签: java apache svg batik

使用: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(run)尝试过;这也行不通了
  • 我不会改变文件,只是SVGDocument。所以我不会将更改写入文件。我只是更改了“文档”实例。
  • 我将文档实例打印到控制台进行日志记录,结果正是我想要的,因此文档包含正确的元素和新元素。

控制台中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队列,setSVGDocument等)不起作用。我现在不知道该怎么做......

提前谢谢。

问候 托拜厄斯

1 个答案:

答案 0 :(得分:0)

必须在SVG名称空间中创建SVG元素。因此,不能使用createElement创建它们,必须使用createElementNS

创建它们
Element createElement = svgDocument.createElement("g");

不正确,需要像这样写......

Element createElement = svgDocument.createElementNS(SVGDOMImplementation.SVG_NAMESPACE_URI, "g");

我不确定SVGUtilities做了什么,因为您还没有提供该实现,但这也可能是错误的。