从ALWAYS_DYNAMIC JSVGCanvas向SVGDocument插入新元素

时间:2011-08-12 08:34:16

标签: java dynamic canvas svg

我想要做的是将新元素插入到从JSVG画布获取的SVGDocument中,以便它应该被自动渲染并且可以被查看。

所以我有一个名为SVGcanvas的JSVGCanvas,在LoadEventDispatcher中我得到了名为doc的SVGDocument,就像这段代码一样:

this.SVGCanvas.addSVGLoadEventDispatcherListener(
    new SVGLoadEventDispatcherAdapter() {
        @Override
        public void svgLoadEventDispatchStarted (SVGLoadEventDispatcherEvent e) {
            doc = SVGCanvas.getSVGDocument();
            ...
        }
}

up基于此:http://www.svgopen.org/2002/papers/kormann__developing_svg_apps_with_batik/

然后在事件监听器中,我使用此代码

public void handleEvent (Event evt) {
    setRB(this.IDButtonGroup, this.ID);
    Element r = ((SVGDocument) doc).createElement("use");
    r.setAttribute("xhtml:href", "#cell");
    doc.getDocumentElement().appendChild(r);
}

基于此:http://wiki.apache.org/xmlgraphics-batik/DynamicSvgOffscreen

我认为它可以在屏幕上工作,但我仍然无法让它工作。有人可以帮忙吗? setRB函数工作正常,所以我认为问题不在处理程序中。我认为SVGCanvas没有呈现新的doc。 doc应该是SVGCanvas的,因为我已经将SVG Canvas的Document State设置为ALWAYS_DYNAMIC,我认为它会自动更新。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

好吧,我这样做的方式是正确的,但我确实错过了一些东西。 基于此:http://www.carto.net/papers/svg/manipulating_svg_with_dom_ecmascript/ 我应该用

public void handleEvent (Event evt) {
    setRB(this.IDButtonGroup, this.ID);
    Element r = ((SVGDocument) doc).createElementNS(SVGNS,"use");
    r.setAttributeNS(XLINKNS, "href", "#cell");
    doc.getDocumentElement().appendChild(r);
}

你完成了!单元格defs现在在SVGCanvas中! 哦,是的,SVGNS和XLINKNS是NameSpace字符串常量

String svgNS = "http://www.w3.org/2000/svg";
var xlinkNS = "http://www.w3.org/1999/xlink";