Как заставить SVG с Batik обновляться / отображаться после изменения DOM? - PullRequest
1 голос
/ 13 марта 2012

Я следовал инструкциям здесь: http://xmlgraphics.apache.org/batik/faq.html и прочитал страницы их списка рассылки.Я перепробовал все, что мог придумать.Вот очень простой пример того, чего я пытаюсь достичь.Менеджер по расположению: http://java.sun.com/products/jfc/tsc/articles/tablelayout/ Или вы можете использовать gridbag или что угодно.XmlHelper - это внутренняя библиотека, вы можете заменить ее собственной.Не включено для сокращения размера кода.

В основном после нажатия кнопки «вверх» (сокращение от «update»), он изменяет 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>

Код выше не включаетзапись в файл - я исключил из-за места.SVG после нажатия кнопки ВВЕРХ и записи в файл (для проверки пространства имен).Когда записывается в файл после нажатия кнопки «ВВЕРХ», это производится - что выглядит идеально для меня.

<?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 Ответ

1 голос
/ 13 марта 2012

Просто изменить

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

до

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

и он будет обновляться нормально

...