2015-05-17 1 views
0

Использование Apache Batik,Apache Batik: Как заставить JSVGComponent вид обновить, когда SVG Dom модифицирована

Попытка получить JSVGComponent обновить (перерисовать) после добавления нового элемента SVG в DOM. Я знаю о ALWAYS_DYNAMIC, и это установлено. Новый элемент (ы) успешно добавлен в документ, но единственный способ, которым я могу заставить компонент перерисовать, - изменить размер представления. При изменении размера появляются новые элементы (появляются). Я также попытался добавить элементы через Runnable с помощью UpdateManager и RunnableQueue. Опять же, элементы успешно добавлены, но не отображаются, пока компонент не будет изменен (путем изменения размера рамки корпуса). Я также попытался вызвать repaint с помощью RunQ Runnable, но это также не работает (на самом деле вызывается перерисовка).

Я думаю, что мне, возможно, придется поехать в мост GVT, но я уверен, что нет.

Помогите необычно оценить. Спасибо.

ответ

0

Вы можете сделать

svgCanvas.setDocument(doc); 

работы Это для в JSVGCanvas, может быть, это будет работает для вас.

Вы также можете попробовать метод:

setSVGDocument(doc); 

Я нашел это:

Есть две общие причины для этого. Во-первых, JSVGCanvas не знает, что это динамический документ. Обычно Batik обнаруживает это, ища элементы сценария, но когда вы изменяете документ с Java, он не может сказать. Поэтому вызовите myJSVGCanvas.setDocumentState (JSVGCanvas.ALWAYS_DYNAMIC); перед загрузкой документа (с помощью setURI, setDocument, setSVGDocument и т. д.).

Вторая общая причина заключается в том, что изменения не внесены в поток UpdateManager. Вы можете запустить код в потоке UpdateManager со следующим: UpdateManager um = JSVGCanvas.getUpdateManager(); . Um.getUpdateRunnableQueue() invokeLater (Runnable); ПРИМЕЧАНИЕ. Менеджер обновлений становится доступным только после завершения первого рендеринга. Вы можете получить уведомление, когда это произойдет, зарегистрировав GVTTreeRendererListener.

Но я не пробовал это пока.

0

Почти такая же проблема для меня: мне пришлось динамически модифицировать фон ящиков (многоугольник).

Согласно MelodyBibi, он работает с setSVGDocument(doc);, но SVG мигает во время обновления. Это не очень заметно.

(лучше) раствор

Мои, чтобы позвонить svgCanvas.getCanvasGraphicsNode().fireGraphicsNodeChangeCompleted(); после изменения модели DOM с помощью polygonElement.setAttribute("fill", "red"); на соответствующем узле.

Я также добавил JSVGCanvas.ALWAYS_DYNAMIC перед первой загрузкой документа.

Теперь мой SVG обновляется в реальном времени, не моргая.

Надеясь, это поможет вам.

0

У меня были некоторые необъяснимые визуальные артефакты, которые исчезли бы только при небольшом перетаскивании, масштабировании и т. Д. Другими словами, трансформация.

Решение заключалось в том, чтобы преобразовать рендеринг в существующее, тем самым заставив холст повторно отобразить.

canvas.setRenderingTransform(canvas.getRenderingTransform());