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 Thomas DeWeese <Th...@Kodak.com> on 2003/08/09 01:33:22 UTC

Re: Dynamic JSVGCanvas Updates

Hi Grant,

Please see: http://xml.apache.org/batik/faqs.html#faq-21


Grant Mc Auley wrote:
> Hello,
> 
> My simple test program (relevant code below) loads an SVG file into a
> JSVGCanvas.  Clicking a button calls a method that iteratively resizes a
> circle in the SVG document.
> 
> What I am observing is this:
> 1) After clicking the toolbar button, I do not see the circle resize
> unless I move my mouse into the canvas.
> 2) Further, unless I continually move my mouse over the canvas I do not
> see the iterative resizing.  That is, when I continuously move the
> mouse, I see the circle change size every second.  When I stop, the
> circle size does not change.  When I move again, I see the updates.  If
> I move outside of the canvas I see no updates.
> 
> How are canvas updates related to mouse position and movement?  Is there
> something else that I must do to see live or dynamic canvas updates?
> 
> 
> // ------- Code:
> 
> JSVGCanvas canvas = new JSVGCanvas();
> File f = new File(shapes.svg");
> String parser = XMLResourceDescriptor.getXMLParserClassName();
> SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
> Document doc = factory.createDocument(f.toURL().toString());
> canvas.setDocument(doc);
> canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
> 
> ...
> 
> button.addActionListener(new ActionListener() {
> 
>   public void actionPerformed(ActionEvent e) {
>     Thread t = new Thread(new Runnable() {
>       public void run() {
>         resizeCircle();
>       }
>     });
>     t.start();
>   }
> 
> });
> 
> ...
> 
> private void resizeCircle() throws DOMException {
> 
>   SVGDocument doc = canvas.getSVGDocument();
>   Element el = doc.getElementById("circleOne");
>   for (int i = 0; i < 10; i++) {
> 
>     if (el.getAttribute("r").equals("20")) { // initial value of r
> (radius) is 20
>       el.setAttribute("r", "50");
>     else
>       el.setAttribute("r", "20");
>     try {
>       Thread.sleep(1000);
>     }
>     catch (InterruptedException ex) {
>     }
> 
>   }
> 
> }
> // -------
> 
> 
> ---------------------------------------------------------------------
> 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: Dynamic JSVGCanvas Updates

Posted by Grant Mc Auley <gm...@som.llu.edu>.
Thanks, it works!

> -----Original Message-----
> From: Thomas DeWeese [mailto:Thomas.DeWeese@Kodak.com] 
> Sent: Saturday, August 09, 2003 6:06 AM
> To: Batik Users
> Subject: Re: Dynamic JSVGCanvas Updates
> 
> 
> Grant Mc Auley wrote:
> > Thank you for your reply.
> > 
> > I have modified my ActionListener:
> > 
> > button.addActionListener(new ActionListener() {
> >   public void actionPerformed(ActionEvent e) {
> >     UpdateManager um = canvas.getUpdateManager();
> >     um.getUpdateRunnableQueue().invokeLater(new Runnable() {
> >       public void run() {
> >         resizeCircle();
> >       }
> >     });
> >   }
> > });
> 
>      This is because resizeCircle doesn't return until the
> last update is complete.  You need to post a new runnable
> to the updateQueue to do each update.  This is just like
> the swing event thread.  If you hold the event thread no
> updates happen in the gui.  If you hold the update thread
> no updates happen in the SVG.
> 
> 
> > and put canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC) *before*
> > canvas.setDocument(doc), as the FAQ says.
> > 
> > Now, I only see the *last update* but not the others in between.
> > 
> > I also implemented updateStarted and updateCompleted methods of
> > UpdateManagerListener and added it to the canvas.  It seems 
> that all the
> > update events are being consolidated into a single event 
> even though I
> > have sleep delays in between the resizings.  In my real 
> application, I
> > need to be able to see many dynamic updates to the SVG that 
> occur pretty
> > close together.  Is there anything else I can do to get the desired
> > behavior?
> 
>     Put the call to resizeCircle in a new thread, and have it dispatch
> a runnable to the updateManager thread every second that does all
> the DOM interaction.
> 
>     Read the FAQ to understand why Batik is architected this way.
> > Any more thoughts would be appreciated.
> > 
> > 
> > 
> >>-----Original Message-----
> >>From: Thomas DeWeese [mailto:Thomas.DeWeese@Kodak.com] 
> >>Sent: Friday, August 08, 2003 4:33 PM
> >>To: Batik Users
> >>Subject: Re: Dynamic JSVGCanvas Updates
> >>
> >>
> >>Hi Grant,
> >>
> >>Please see: http://xml.apache.org/batik/faqs.html#faq-21
> >>
> >>
> >>Grant Mc Auley wrote:
> >>
> >>>Hello,
> >>>
> >>>My simple test program (relevant code below) loads an SVG 
> >>
> >>file into a
> >>
> >>>JSVGCanvas.  Clicking a button calls a method that 
> >>
> >>iteratively resizes a
> >>
> >>>circle in the SVG document.
> >>>
> >>>What I am observing is this:
> >>>1) After clicking the toolbar button, I do not see the 
> circle resize
> >>>unless I move my mouse into the canvas.
> >>>2) Further, unless I continually move my mouse over the 
> >>
> >>canvas I do not
> >>
> >>>see the iterative resizing.  That is, when I continuously move the
> >>>mouse, I see the circle change size every second.  When I stop, the
> >>>circle size does not change.  When I move again, I see the 
> >>
> >>updates.  If
> >>
> >>>I move outside of the canvas I see no updates.
> >>>
> >>>How are canvas updates related to mouse position and 
> >>
> >>movement?  Is there
> >>
> >>>something else that I must do to see live or dynamic 
> canvas updates?
> >>>
> >>>
> >>>// ------- Code:
> >>>
> >>>JSVGCanvas canvas = new JSVGCanvas();
> >>>File f = new File(shapes.svg");
> >>>String parser = XMLResourceDescriptor.getXMLParserClassName();
> >>>SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
> >>>Document doc = factory.createDocument(f.toURL().toString());
> >>>canvas.setDocument(doc);
> >>>canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
> >>>
> >>>...
> >>>
> >>>button.addActionListener(new ActionListener() {
> >>>
> >>>  public void actionPerformed(ActionEvent e) {
> >>>    Thread t = new Thread(new Runnable() {
> >>>      public void run() {
> >>>        resizeCircle();
> >>>      }
> >>>    });
> >>>    t.start();
> >>>  }
> >>>
> >>>});
> >>>
> >>>...
> >>>
> >>>private void resizeCircle() throws DOMException {
> >>>
> >>>  SVGDocument doc = canvas.getSVGDocument();
> >>>  Element el = doc.getElementById("circleOne");
> >>>  for (int i = 0; i < 10; i++) {
> >>>
> >>>    if (el.getAttribute("r").equals("20")) { // initial value of r
> >>>(radius) is 20
> >>>      el.setAttribute("r", "50");
> >>>    else
> >>>      el.setAttribute("r", "20");
> >>>    try {
> >>>      Thread.sleep(1000);
> >>>    }
> >>>    catch (InterruptedException ex) {
> >>>    }
> >>>
> >>>  }
> >>>
> >>>}
> >>>// -------
> >>>
> >>>
> >>>
> >>
> >>------------------------------------------------------------
> ---------
> >>
> >>>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
> > 
> > 
> 
> 
> 
> 
> ---------------------------------------------------------------------
> 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: Dynamic JSVGCanvas Updates

Posted by Thomas DeWeese <Th...@Kodak.com>.
Grant Mc Auley wrote:
> Thank you for your reply.
> 
> I have modified my ActionListener:
> 
> button.addActionListener(new ActionListener() {
>   public void actionPerformed(ActionEvent e) {
>     UpdateManager um = canvas.getUpdateManager();
>     um.getUpdateRunnableQueue().invokeLater(new Runnable() {
>       public void run() {
>         resizeCircle();
>       }
>     });
>   }
> });

     This is because resizeCircle doesn't return until the
last update is complete.  You need to post a new runnable
to the updateQueue to do each update.  This is just like
the swing event thread.  If you hold the event thread no
updates happen in the gui.  If you hold the update thread
no updates happen in the SVG.


> and put canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC) *before*
> canvas.setDocument(doc), as the FAQ says.
> 
> Now, I only see the *last update* but not the others in between.
> 
> I also implemented updateStarted and updateCompleted methods of
> UpdateManagerListener and added it to the canvas.  It seems that all the
> update events are being consolidated into a single event even though I
> have sleep delays in between the resizings.  In my real application, I
> need to be able to see many dynamic updates to the SVG that occur pretty
> close together.  Is there anything else I can do to get the desired
> behavior?

    Put the call to resizeCircle in a new thread, and have it dispatch
a runnable to the updateManager thread every second that does all
the DOM interaction.

    Read the FAQ to understand why Batik is architected this way.
> Any more thoughts would be appreciated.
> 
> 
> 
>>-----Original Message-----
>>From: Thomas DeWeese [mailto:Thomas.DeWeese@Kodak.com] 
>>Sent: Friday, August 08, 2003 4:33 PM
>>To: Batik Users
>>Subject: Re: Dynamic JSVGCanvas Updates
>>
>>
>>Hi Grant,
>>
>>Please see: http://xml.apache.org/batik/faqs.html#faq-21
>>
>>
>>Grant Mc Auley wrote:
>>
>>>Hello,
>>>
>>>My simple test program (relevant code below) loads an SVG 
>>
>>file into a
>>
>>>JSVGCanvas.  Clicking a button calls a method that 
>>
>>iteratively resizes a
>>
>>>circle in the SVG document.
>>>
>>>What I am observing is this:
>>>1) After clicking the toolbar button, I do not see the circle resize
>>>unless I move my mouse into the canvas.
>>>2) Further, unless I continually move my mouse over the 
>>
>>canvas I do not
>>
>>>see the iterative resizing.  That is, when I continuously move the
>>>mouse, I see the circle change size every second.  When I stop, the
>>>circle size does not change.  When I move again, I see the 
>>
>>updates.  If
>>
>>>I move outside of the canvas I see no updates.
>>>
>>>How are canvas updates related to mouse position and 
>>
>>movement?  Is there
>>
>>>something else that I must do to see live or dynamic canvas updates?
>>>
>>>
>>>// ------- Code:
>>>
>>>JSVGCanvas canvas = new JSVGCanvas();
>>>File f = new File(shapes.svg");
>>>String parser = XMLResourceDescriptor.getXMLParserClassName();
>>>SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
>>>Document doc = factory.createDocument(f.toURL().toString());
>>>canvas.setDocument(doc);
>>>canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
>>>
>>>...
>>>
>>>button.addActionListener(new ActionListener() {
>>>
>>>  public void actionPerformed(ActionEvent e) {
>>>    Thread t = new Thread(new Runnable() {
>>>      public void run() {
>>>        resizeCircle();
>>>      }
>>>    });
>>>    t.start();
>>>  }
>>>
>>>});
>>>
>>>...
>>>
>>>private void resizeCircle() throws DOMException {
>>>
>>>  SVGDocument doc = canvas.getSVGDocument();
>>>  Element el = doc.getElementById("circleOne");
>>>  for (int i = 0; i < 10; i++) {
>>>
>>>    if (el.getAttribute("r").equals("20")) { // initial value of r
>>>(radius) is 20
>>>      el.setAttribute("r", "50");
>>>    else
>>>      el.setAttribute("r", "20");
>>>    try {
>>>      Thread.sleep(1000);
>>>    }
>>>    catch (InterruptedException ex) {
>>>    }
>>>
>>>  }
>>>
>>>}
>>>// -------
>>>
>>>
>>>
>>
>>---------------------------------------------------------------------
>>
>>>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
> 
> 




---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xml.apache.org
For additional commands, e-mail: batik-users-help@xml.apache.org


RE: Dynamic JSVGCanvas Updates

Posted by Grant Mc Auley <gm...@som.llu.edu>.
Thank you for your reply.

I have modified my ActionListener:

button.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    UpdateManager um = canvas.getUpdateManager();
    um.getUpdateRunnableQueue().invokeLater(new Runnable() {
      public void run() {
        resizeCircle();
      }
    });
  }
});

and put canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC) *before*
canvas.setDocument(doc), as the FAQ says.

Now, I only see the *last update* but not the others in between.

I also implemented updateStarted and updateCompleted methods of
UpdateManagerListener and added it to the canvas.  It seems that all the
update events are being consolidated into a single event even though I
have sleep delays in between the resizings.  In my real application, I
need to be able to see many dynamic updates to the SVG that occur pretty
close together.  Is there anything else I can do to get the desired
behavior?

Any more thoughts would be appreciated.


> -----Original Message-----
> From: Thomas DeWeese [mailto:Thomas.DeWeese@Kodak.com] 
> Sent: Friday, August 08, 2003 4:33 PM
> To: Batik Users
> Subject: Re: Dynamic JSVGCanvas Updates
> 
> 
> Hi Grant,
> 
> Please see: http://xml.apache.org/batik/faqs.html#faq-21
> 
> 
> Grant Mc Auley wrote:
> > Hello,
> > 
> > My simple test program (relevant code below) loads an SVG 
> file into a
> > JSVGCanvas.  Clicking a button calls a method that 
> iteratively resizes a
> > circle in the SVG document.
> > 
> > What I am observing is this:
> > 1) After clicking the toolbar button, I do not see the circle resize
> > unless I move my mouse into the canvas.
> > 2) Further, unless I continually move my mouse over the 
> canvas I do not
> > see the iterative resizing.  That is, when I continuously move the
> > mouse, I see the circle change size every second.  When I stop, the
> > circle size does not change.  When I move again, I see the 
> updates.  If
> > I move outside of the canvas I see no updates.
> > 
> > How are canvas updates related to mouse position and 
> movement?  Is there
> > something else that I must do to see live or dynamic canvas updates?
> > 
> > 
> > // ------- Code:
> > 
> > JSVGCanvas canvas = new JSVGCanvas();
> > File f = new File(shapes.svg");
> > String parser = XMLResourceDescriptor.getXMLParserClassName();
> > SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
> > Document doc = factory.createDocument(f.toURL().toString());
> > canvas.setDocument(doc);
> > canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
> > 
> > ...
> > 
> > button.addActionListener(new ActionListener() {
> > 
> >   public void actionPerformed(ActionEvent e) {
> >     Thread t = new Thread(new Runnable() {
> >       public void run() {
> >         resizeCircle();
> >       }
> >     });
> >     t.start();
> >   }
> > 
> > });
> > 
> > ...
> > 
> > private void resizeCircle() throws DOMException {
> > 
> >   SVGDocument doc = canvas.getSVGDocument();
> >   Element el = doc.getElementById("circleOne");
> >   for (int i = 0; i < 10; i++) {
> > 
> >     if (el.getAttribute("r").equals("20")) { // initial value of r
> > (radius) is 20
> >       el.setAttribute("r", "50");
> >     else
> >       el.setAttribute("r", "20");
> >     try {
> >       Thread.sleep(1000);
> >     }
> >     catch (InterruptedException ex) {
> >     }
> > 
> >   }
> > 
> > }
> > // -------
> > 
> > 
> > 
> ---------------------------------------------------------------------
> > 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