2012-03-12 16 views
1

こちらのガイドラインはhttp://xmlgraphics.apache.org/batik/faq.htmlで、メーリングリストのページを読んでいます。私は考えることができるすべてを試しました。ここで私が達成しようとしているものの非常に単純な例があります。レイアウトマネージャー:http://java.sun.com/products/jfc/tsc/articles/tablelayout/または、あなたが好きなものを使用することができます。 XmlHelperは社内のlibであり、あなた自身のもので代用することができます。コードサイズを減らすためには含まれていません。DOMが変更された後、BatikでSVGをリフレッシュ/表示する方法を教えてください。

「アップ」ボタン(更新の略)を押すと、DOMを変更して新しい要素が追加されますが、SVGの更新は表示されません。

..

public class SvgRefresh extends JFrame 
{ 
    private static final NAMESPACE = "http://www.w3.org/2000/svg"; 

    private JSVGCanvas canvas; 
    private Document document; 
    private JButton button; 

    public static void main(String[] args) 
    { 
    SvgRefresh svgRefresh = new SvgRefresh(); 

    svgRefresh.pack(); 
    svgRefresh.setVisible(true); 
    } 

    public SvgRefresh() 
    { 
    canvas = new JSVGCanvas(); 
    initialize(); 
    } 

    private void initialize() 
    { 
    double[][] size = {{ TableLayout.FILL, 0.1, TableLayout.FILL}, { TableLayout.FILL, 0.1 }}; 
    getContentPane().setLayout(new TableLayout(size)); 

    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
    document = XmlHelper.readDocumentFromFile("F:/SVG/svg01.svg"); 

    canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC); 
    canvas.setDocument(document); 

    document = canvas.getSVGDocument(); 

    getContentPane().add(canvas, "0, 0, 2, 0"); 
    getContentPane().add(getButton(), "1, 1"); 
    } 

    private JButton getButton() 
    { 
    if(button == null) 
    { 
     button = new JButton("Up"); 

     button.addActionListener(new ActionListener() 
     { 
     @Override 
     public void actionPerformed(ActionEvent e) 
     { 
      UpdateManager updateManager = canvas.getUpdateManager(); 

      updateManager.getUpdateRunnableQueue().invokeLater(new Runnable() 
      { 
      @Override 
      public void run() 
      { 
       Element root = document.getDocumentElement(); 
       Element text = document.createElementNS(NAMESPACE, "text"); 

       text.setAttributeNS(NAMESPACE, "x", "100"); 
       text.setAttributeNS(NAMESPACE, "y", "100"); 
       text.setTextContent("It worked!!!"); 

       root.appendChild(text); 
       System.out.println("ran"); 
      } 
      }); 
     } 
     }); 
    } 

    return button; 
    } 
} 

オリジナルSVG(AIで行われた、と私はテキスト要素を除くすべてのコンテンツを編集した):上記

<?xml version="1.0" encoding="UTF-8"?><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="application/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" enable-background="new 0 0 400 200" version="1.1" xml:space="preserve" width="400px" preserveAspectRatio="xMidYMid meet" viewBox="0 0 400 200" height="200px" x="0px" y="0px"> 
    <text x="40" y="40">Default text</text> 
</svg> 

コードは、ファイルへの書き込みは含まれません - 私はスペースのために除外しました。 UPボタンを押してSVGを呼び出し、ファイルに書き込む(名前空間をチェックする)。 "UP"ボタンを押してファイルに書き込むと、これが生成されます。これは私にとって完璧です。

<?xml version="1.0" encoding="UTF-8"?><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="application/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" enable-background="new 0 0 400 200" version="1.1" xml:space="preserve" width="400px" preserveAspectRatio="xMidYMid meet" viewBox="0 0 400 200" height="200px" x="0px" y="0px"> 
    <text x="40" y="40">Default text</text> 
    <text x="100" y="100">It worked!!!</text> 
</svg> 

ありがとうございました。ああ、研究を奨励するために、そして回答に時間を割く人は、私はおそらく答えを与える前に約24時間待つでしょう。だから、必要なら時間をかけてコードを実行してください。

+1

を更新し、次にあなたが左上隅にいくつかのノイズが表示されますウィンドウのサイズを変更します。新しいテキストがここにあります。 変換やレンダリングで何らかの問題が起きていると確信しています – yggdraa

答えて

1

ちょうど

  text.setAttributeNS(null, "x", "100"); 
      text.setAttributeNS(null, "y", "100"); 

  text.setAttributeNS(NAMESPACE, "x", "100"); 
      text.setAttributeNS(NAMESPACE, "y", "100"); 

を変更すると、それはあなたがUP押すと罰金

+0

うわー...ありがとう!私はsooを費やして、これに多くの時間を費やしました。私は名前空間の有無にかかわらず試しましたが、要素に名前空間を残して属性から取り除こうとはしませんでした。私はちょうど戻って、彼らの文書を再読しました、そして、実際には要素上にそれを持っていると言いますが、属性にはありません。私は何とかそれを何度か間違って読むことができました。再びありがとう! –

関連する問題