You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-users@xmlgraphics.apache.org by Steven Gollery <sg...@cadrc.calpoly.edu> on 2003/06/24 22:28:08 UTC
redrawing JSVGCanvas after changes
I'm having trouble getting the JSVGCanvas to update after I change the
properties of an element. Answers to similar questions in the archives
seem to involve subclasses of JSVGCanvas, overlays, or some other
situations that don't seem to apply. Here's the relevant code:
DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
doc = (SVGDocument)impl.createDocument(svgNS, "svg", null);
svgCanvas.setSVGDocument(doc);
svgCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
Element svgRoot = doc.getDocumentElement();
// set the width and height attribute on the root svg element
svgRoot.setAttributeNS(null, "width", "400");
svgRoot.setAttributeNS(null, "height", "450");
Element rectangle = doc.createElementNS(svgNS, "rect");
rectangle.setAttributeNS(null, "x", "10");
rectangle.setAttributeNS(null, "y", "20");
rectangle.setAttributeNS(null, "width", "100");
rectangle.setAttributeNS(null, "height", "50");
rectangle.setAttributeNS(null, "style", "fill:red");
svgRoot.appendChild(rectangle);
((EventTarget)rectangle).addEventListener("click", new
EventListener() {
public void handleEvent(org.w3c.dom.events.Event evt) {
Element target = (Element)evt.getTarget();
String style = target.getAttributeNS(null, "style");
if ("fill:red".equals(style)) {
target.setAttributeNS(null, "style", "fill:blue");
} else {
target.setAttributeNS(null, "style", "fill:red");
}
}}, false);
This starts out as a copy of one of the code samples. I inserted the
"addEventListener" part.
handleEvent does get called each time I click the rectangle, and the
"style" attribute does change, but the displayed color of the rectangle
stays red. I've tried calling
svgCanvas.paintComponent(svgCanvas.getGraphics( )) after resetting the
style, but no effect.
Obviously I'm missing something basic here, or I'm on the wrong track
altogether. Any help would be appreciated.
Thanks,
Steven Gollery
sgollery@cadrc.calpoly.edu
---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org
Re: redrawing JSVGCanvas after changes
Posted by Steven Gollery <sg...@cadrc.calpoly.edu>.
Thomas --
Thanks for the help. After a couple of hours I finally got it to work.
The approach of adding event handlers to the document programmatically
is not well documented, or else I just haven't been able to find the
right tutorial or whatever. Is there somewhere a better source of
information than the sample programs that come with Batik?
Steven Gollery
Thomas DeWeese wrote:
> Steven Gollery wrote:
>
>> I'm having trouble getting the JSVGCanvas to update after I change
>> the properties of an element. Answers to similar questions in the
>> archives seem to involve subclasses of JSVGCanvas, overlays, or some
>> other situations that don't seem to apply. Here's the relevant code:
>>
>> DOMImplementation impl =
>> SVGDOMImplementation.getDOMImplementation();
>> String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
>> doc = (SVGDocument)impl.createDocument(svgNS, "svg", null);
>>
>> svgCanvas.setSVGDocument(doc);
>
>
> Once you give the document the the Canvas you may only safely
> modify it
> in the Update thread. I suspect that if you move all your DOM
> manipulations
> before setting the document or move them after the UpdateManager has
> started (gvtRenderCompleted event) and put then in an UpdateManager
> Runnable things
> will start working for you. As it is you are mucking with the DOM at
> the same
> time as Batik is trying to build the rendering tree. I'm not
> surprised you have
> problems. BTW the following does work (equivilent code in ECMA script
> where
> Batik can make sure things are always done in the proper thread :)
>
> <?xml version="1.0" standalone="no"?>
> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
> "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
>
> <svg xmlns="http://www.w3.org/2000/svg"
> xmlns:xlink="http://www.w3.org/1999/xlink"
> width="450" height="500" viewBox="0 0 450 500">
>
> <script type="text/ecmascript">
> function click(evt) {
> var tgt = evt.target;
> var style = tgt.getAttributeNS(null, "style");
> if (style == "fill:red" ) {
> tgt.setAttributeNS(null, "style", "fill:blue");
> } else {
> tgt.setAttributeNS(null, "style", "fill:red");
> }
> }
> </script>
>
> <rect x="10" y="20" width="100" height="50" style="fill:red"
> onclick="click(evt)"/>
>
> </svg>
>
>
>>
>> svgCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
>>
>> Element svgRoot = doc.getDocumentElement();
>>
>> // set the width and height attribute on the root svg element
>> svgRoot.setAttributeNS(null, "width", "400");
>> svgRoot.setAttributeNS(null, "height", "450");
>> Element rectangle = doc.createElementNS(svgNS, "rect");
>> rectangle.setAttributeNS(null, "x", "10");
>> rectangle.setAttributeNS(null, "y", "20");
>> rectangle.setAttributeNS(null, "width", "100");
>> rectangle.setAttributeNS(null, "height", "50");
>> rectangle.setAttributeNS(null, "style", "fill:red");
>> svgRoot.appendChild(rectangle);
>>
>> ((EventTarget)rectangle).addEventListener("click", new
>> EventListener() {
>> public void handleEvent(org.w3c.dom.events.Event evt) {
>> Element target = (Element)evt.getTarget();
>> String style = target.getAttributeNS(null, "style");
>> if ("fill:red".equals(style)) {
>> target.setAttributeNS(null, "style", "fill:blue");
>> } else {
>> target.setAttributeNS(null, "style", "fill:red");
>> }
>> }}, false);
>>
>>
>> This starts out as a copy of one of the code samples. I inserted the
>> "addEventListener" part.
>>
>> handleEvent does get called each time I click the rectangle, and the
>> "style" attribute does change, but the displayed color of the
>> rectangle stays red. I've tried calling
>> svgCanvas.paintComponent(svgCanvas.getGraphics( )) after resetting
>> the style, but no effect.
>>
>> Obviously I'm missing something basic here, or I'm on the wrong track
>> altogether. Any help would be appreciated.
>>
>> Thanks,
>>
>> Steven Gollery
>> sgollery@cadrc.calpoly.edu
>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
>> For additional commands, e-mail: batik-users-help@xml.apache.org
>>
>>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
> For additional commands, e-mail: batik-users-help@xml.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org
Re: redrawing JSVGCanvas after changes
Posted by Thomas DeWeese <Th...@Kodak.com>.
Steven Gollery wrote:
> I'm having trouble getting the JSVGCanvas to update after I change the
> properties of an element. Answers to similar questions in the archives
> seem to involve subclasses of JSVGCanvas, overlays, or some other
> situations that don't seem to apply. Here's the relevant code:
>
> DOMImplementation impl =
> SVGDOMImplementation.getDOMImplementation();
> String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
> doc = (SVGDocument)impl.createDocument(svgNS, "svg", null);
>
> svgCanvas.setSVGDocument(doc);
Once you give the document the the Canvas you may only safely modify it
in the Update thread. I suspect that if you move all your DOM manipulations
before setting the document or move them after the UpdateManager has
started (gvtRenderCompleted event) and put then in an UpdateManager
Runnable things
will start working for you. As it is you are mucking with the DOM at
the same
time as Batik is trying to build the rendering tree. I'm not surprised
you have
problems. BTW the following does work (equivilent code in ECMA script where
Batik can make sure things are always done in the proper thread :)
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="450" height="500" viewBox="0 0 450 500">
<script type="text/ecmascript">
function click(evt) {
var tgt = evt.target;
var style = tgt.getAttributeNS(null, "style");
if (style == "fill:red" ) {
tgt.setAttributeNS(null, "style", "fill:blue");
} else {
tgt.setAttributeNS(null, "style", "fill:red");
}
}
</script>
<rect x="10" y="20" width="100" height="50" style="fill:red"
onclick="click(evt)"/>
</svg>
>
> svgCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
>
> Element svgRoot = doc.getDocumentElement();
>
> // set the width and height attribute on the root svg element
> svgRoot.setAttributeNS(null, "width", "400");
> svgRoot.setAttributeNS(null, "height", "450");
> Element rectangle = doc.createElementNS(svgNS, "rect");
> rectangle.setAttributeNS(null, "x", "10");
> rectangle.setAttributeNS(null, "y", "20");
> rectangle.setAttributeNS(null, "width", "100");
> rectangle.setAttributeNS(null, "height", "50");
> rectangle.setAttributeNS(null, "style", "fill:red");
> svgRoot.appendChild(rectangle);
>
> ((EventTarget)rectangle).addEventListener("click", new
> EventListener() {
> public void handleEvent(org.w3c.dom.events.Event evt) {
> Element target = (Element)evt.getTarget();
> String style = target.getAttributeNS(null, "style");
> if ("fill:red".equals(style)) {
> target.setAttributeNS(null, "style", "fill:blue");
> } else {
> target.setAttributeNS(null, "style", "fill:red");
> }
> }}, false);
>
>
> This starts out as a copy of one of the code samples. I inserted the
> "addEventListener" part.
>
> handleEvent does get called each time I click the rectangle, and the
> "style" attribute does change, but the displayed color of the
> rectangle stays red. I've tried calling
> svgCanvas.paintComponent(svgCanvas.getGraphics( )) after resetting the
> style, but no effect.
>
> Obviously I'm missing something basic here, or I'm on the wrong track
> altogether. Any help would be appreciated.
>
> Thanks,
>
> Steven Gollery
> sgollery@cadrc.calpoly.edu
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
> For additional commands, e-mail: batik-users-help@xml.apache.org
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org