2011-10-12 3 views
2

DOM操作のみを使用して(DOMクラスを使用して)GWTで単純なSVGグラフィックスを作成したいとします。最終的に(GWTコンパイラでコンパイルした後に)、要素を<svg>要素内に入れたいと思います。<path> inside <svg> GWT DOMクラスを使用して画面に表示されない

次のように最終的な効果は、多かれ少なかれ、になります。ここでは

<html> 
<body> 
    <svg> 
    <path stroke="black" d="M200 200 L300 150"></path> 
    </svg> 
</body> 
</html> 

は、このような効果を作成する必要がありますJavaのGWTコードです:

Element svg = DOM.createElement("svg"); 
    Document.get().getBody().appendChild(svg); 

    Element path = DOM.createElement("path"); 
    path.setAttribute("stroke", "black"); 
    path.setAttribute("d", "M200 200 L300 150"); 
    svg.appendChild(path); 

問題がされパスがブラウザに表示されない(私は白い背景しか見ることができません)。非常に興味深いのは、ブラウザを介してページのソースが表示されている場合は、ソース全体(<html>から</html>)をコピーしてテキストエディタで新しい空のドキュメントに貼り付け、ハードドライブにHTMLファイルとして保存して開きますブラウザでは、パスが表示されます(ソースが正しく更新されたことを意味します)。

なぜ初めてパスが画面に表示されないのですか?(2回目に表示されます)

ありがとうございました!

編集: それはComplexPanelを使用して、判明、私は<path>要素を描きたい場合は、XML名前空間が作品のよう。しかし今、に沿ってというテキストを描きたいと思います。

最終的な効果は、次のようになります。パスに沿ってテキストがまで表示されません

class SVGPanel extends ComplexPanel { 
    private static final String SVG_NAMESPACE = "http://www.w3.org/2000/svg"; 

    public SVGPanel() { 
     setElement(createElementNS(SVG_NAMESPACE, "svg")); 
     showcaseSVG(); 
    } 

    private void showcaseSVG() { 
     Element defs = createElementNS(SVG_NAMESPACE, "defs"); 
     getElement().appendChild(defs); 

     Element path = createElementNS(SVG_NAMESPACE, "path"); 
     path.setAttribute("id", "myPath"); 
     path.setAttribute("stroke", "black"); 
     path.setAttribute("d", "M75,20 a1,1 0 0,0 100,0"); 
     defs.appendChild(path); 

     Element text = createElementNS(SVG_NAMESPACE, "text"); 
     text.setAttribute("x", "10"); 
     text.setAttribute("y", "100"); 
     getElement().appendChild(text); 

     Element textPath = createElementNS(SVG_NAMESPACE, "textPath"); 
     textPath.setAttribute("xlink:href", "#myPath"); 
     textPath.setInnerText("Text along a curved path..."); 
     text.appendChild(textPath); 
    } 

    private native Element createElementNS(final String ns, 
      final String name)/*-{ 
     return document.createElementNS(ns, name); 
    }-*/; 
} 

<svg> 
<defs> 
    <path id="myPath" stroke="black" d="M75,20 a1,1 0 0,0 100,0"></path> 
</defs> 
<text x="10" y="100"> 
    <textPath xlink:href="#myPath">Text along a curved path...</textPath> 
</text> 
</svg> 

それを生成する必要がありますJavaコードを。もちろん、以前のように、生成されたソースを新しいHTMLファイルにコピーしてブラウザで開くと、

答えて

3

私はあなたがのxlink名前空間に渡し、setAttributeNSを使用する必要があると思います。

だから上記のコードでは、置き換え:

textPath.setAttribute("xlink:href", "#myPath"); 

で:

textPath.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", "#myPath"); 
+0

はい、**作品**!ありがとう、エリック。もちろん、textPath要素にはsetAttributeNSメソッドがありません(あなたは精神的なショートカットを使用したと思います)。そこで私は、JSNIメソッド 'private native void setAttributeNS(String uri、Element elem、String attr、String value)を作成しました/ * - { \t \t \t elem.setAttributeNS(uri、attr、value); \t \t} - * /; '適切なパラメータで呼び出されます。 – DeprecatedMethod

+0

精神的なショートカットはなく、サンプルコードをコピーして貼り付けただけです:) –

2

まあ問題は、svgのために定義された名前空間がないように思われます。また、svgsはComplexPanelで設定されている場合にのみ、GWTで描画されるようです。

ここでは、GWTでSVG要素を描画する方法の例を示します。

package XXXXXXX; 

import com.google.gwt.user.client.Element; 
import com.google.gwt.user.client.ui.ComplexPanel; 

public class SVGPanel extends ComplexPanel { 
    private static final String SVG_NAMESPACE = "http://www.w3.org/2000/svg"; 

    public SVGPanel() { 
     setElement(createElementNS(SVG_NAMESPACE, "svg")); 
     showcaseSVG(); // Demonstrate that SVG works! Inexplicably! 
    } 

    private void showcaseSVG() { 
     Element svgElement = createElementNS(SVG_NAMESPACE, "circle"); 
     svgElement.setAttribute("cx", "50"); 
     svgElement.setAttribute("cy", "50"); 
     svgElement.setAttribute("r", "30"); 
     getElement().appendChild(svgElement); 
    } 

    private static native Element createElementNS(final String ns, 
      final String name)/*-{ 
     return document.createElementNS(ns, name); 
    }-*/; 
} 

これをルートパネルに追加すると、指定したパスが描画されます。

出典:http://de.w3support.net/index.php?db=so&id=691809

よろしく、 ステファン

+0

**ありがとう**、あなたの非常に有用な答えのためのステファン、。あなたは正しく、今度は ''要素**が表示されます(レンダリングされます)。私が上で説明した問題は、別の同様の目標の単純さです。達成したいのは、 ''要素が ''の中にあるパスに沿ったテキストです。残念ながら、** ComplexPanelとXML名前空間であなたのソリューションを使用すると**動作しません。簡単なテストケースやその他の詳細は私の最初の質問に追加されます。 – DeprecatedMethod

関連する問題