I found out that when the Exception occurs "bounds" in the getViewBoxRect 
method is null. That's why it returns null.

Rectangle2D bounds = gn.getBounds();

Maybe this is part of the problem? What does getBounds() do?

--- aaaa aaaa <[EMAIL PROTECTED]> schrieb am Mi, 28.5.2008:

> Von: aaaa aaaa <[EMAIL PROTECTED]>
> Betreff: Re: Repainting a JSVGCanvas
> An: [email protected]
> Datum: Mittwoch, 28. Mai 2008, 11:02
> Hi,
> not the resizing triggers the exception. The occurance of
> the exception seems completely arbitrary to me and is not
> reproduced easily. 
> 
> I think it only occurs when I move the cursor over an svg
> element where the set attribute is used so that the fill
> attribute changes. Resizing repaints the canvas. So my
> first (and dirty) solution was to make this kind of repaint
> when the variable is null.
> 
> Of course it would be better when I would understand why I
> get this NullPointer Exception.
> 
> 
> I have following classes (SVGArea and SVGAreaPainter) which
> displays the document. The SVGArea is used by the
> SVGAreaPainter. The SVGAreaPainter has a lot methods. The
> one that makes the mouseover effect for some elements is
> 
>       private void addMouseOverEffect(Element el, String color)
> {
>               Element mouseOver = doc.createElementNS(svgNS,
> "set");
>               mouseOver.setAttributeNS(null, "attributeName",
> "fill");
>               mouseOver.setAttributeNS(null, "attributeType",
> "XML");
>               mouseOver.setAttributeNS(null, "to", color);
>               mouseOver.setAttributeNS(null, "begin",
> "mouseover");
>               el.appendChild(mouseOver);
>               Element mouseOut = doc.createElementNS(svgNS,
> "set");
>               mouseOut.setAttributeNS(null, "attributeName",
> "fill");
>               mouseOut.setAttributeNS(null, "attributeType",
> "XML");
>               mouseOut.setAttributeNS(null, "to",
> el.getAttribute("fill"));
>               mouseOut.setAttributeNS(null, "begin",
> "mouseout");
>               el.appendChild(mouseOut);
>       }
> ----------------------------------------------------------------
> SVGArea class:
> 
> package de.unidue.inf.xmlvis.gui.svg;
> 
> import java.awt.event.MouseWheelEvent;
> import java.awt.event.MouseWheelListener;
> 
> import javax.swing.SwingUtilities;
> 
> import org.apache.batik.dom.svg.SVGDOMImplementation;
> import org.apache.batik.swing.JSVGCanvas;
> import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
> import org.apache.batik.swing.gvt.GVTTreeRendererListener;
> import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
> import org.apache.batik.swing.svg.GVTTreeBuilderListener;
> import
> org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent;
> import
> org.apache.batik.swing.svg.SVGLoadEventDispatcherListener;
> import org.apache.log4j.Logger;
> import org.w3c.dom.DOMImplementation;
> import org.w3c.dom.Document;
> import org.w3c.dom.Element;
> import org.w3c.dom.svg.SVGDocument;
> 
> import de.unidue.inf.xmlvis.gui.StatusBarManager;
> 
> public class SVGArea extends JSVGCanvas implements
> SVGLoadEventDispatcherListener, GVTTreeRendererListener,
> GVTTreeBuilderListener,
>               MouseWheelListener {
> 
>       private static final long serialVersionUID =
> -4835732750510548844L;
>       @SuppressWarnings("unused")
>       private static final Logger logger =
> Logger.getLogger(SVGArea.class);
>       private static final String svgNS =
> SVGDOMImplementation.SVG_NAMESPACE_URI;
>       private static final DOMImplementation impl =
> SVGDOMImplementation.getDOMImplementation();
>       private int width;
>       private int height;
>       private Document doc = null;
>       private Element svgRoot;
>       private JSVGScrollPane scroll;
> 
>       public SVGArea() {
>               super(null, true, false);
>               addSVGLoadEventDispatcherListener(this);
>               addGVTTreeRendererListener(this);
>               addGVTTreeBuilderListener(this);
>               addMouseWheelListener(this);
>               setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
>               doc = impl.createDocument(svgNS, "svg", null);
>               svgRoot = doc.getDocumentElement();
>       }
> 
>       public void setDocument() {
>               setSVGDocument((SVGDocument) doc);
>       }
> 
>       public Document getDocument() {
>               return doc;
>       }
> 
>       public void resetSVGDocument() {
>               doc = impl.createDocument(svgNS, "svg", null);
>               svgRoot = doc.getDocumentElement();
>       }
> 
>       @Override
>       public void
> svgLoadEventDispatchCancelled(SVGLoadEventDispatcherEvent
> e) {
>               StatusBarManager.svgLoadEventDispatchCancelled();
>       }
> 
>       @Override
>       public void
> svgLoadEventDispatchCompleted(SVGLoadEventDispatcherEvent
> e) {
>       }
> 
>       @Override
>       public void
> svgLoadEventDispatchFailed(SVGLoadEventDispatcherEvent e) {
>               StatusBarManager.svgLoadEventDispatchFailed();
>       }
> 
>       @Override
>       public void
> svgLoadEventDispatchStarted(SVGLoadEventDispatcherEvent e)
> {
>               StatusBarManager.svgLoadEventDispatchStarted();
>       }
> 
>       @Override
>       public void gvtRenderingCancelled(GVTTreeRendererEvent e)
> {
>       }
> 
>       @Override
>       public void gvtRenderingCompleted(GVTTreeRendererEvent e)
> {
>               StatusBarManager.gvtRenderingCompleted();
>       }
> 
>       @Override
>       public void gvtRenderingFailed(GVTTreeRendererEvent e) {
>       }
> 
>       @Override
>       public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
>       }
> 
>       @Override
>       public void gvtRenderingStarted(GVTTreeRendererEvent e) {
>       }
> 
>       @Override
>       public void gvtBuildCancelled(GVTTreeBuilderEvent e) {
>       }
> 
>       @Override
>       public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
>       }
> 
>       @Override
>       public void gvtBuildFailed(GVTTreeBuilderEvent e) {
>       }
> 
>       @Override
>       public void gvtBuildStarted(GVTTreeBuilderEvent e) {
>       }
> 
>       public void setSVGSize(int width, int height) {
>               this.width = width;
>               this.height = height;
>               svgRoot.setAttributeNS(null, "width",
> String.valueOf(width));
>               svgRoot.setAttributeNS(null, "height",
> String.valueOf(height));
>               SVGAreaPainter painter = new SVGAreaPainter(this);
>               painter.drawText(0, 0, ".", 1);
>               painter.drawText(width, height, ".", 1);
>       }
> 
>       public float getSVGWidth() {
>               return width;
>       }
> 
>       public float getSVGHeight() {
>               return height;
>       }
> 
>       @Override
>       public void mouseWheelMoved(final MouseWheelEvent e) {
>               SwingUtilities.invokeLater(new Runnable() {
> 
>                       @Override
>                       public void run() {
>                               // An das passende ScrollPane weiterleiten
>                               if (scroll != null) {
>                                       scroll.dispatchEvent(e);
>                               }
>                       }
> 
>               });
> 
>       }
>       
>       public void setScroll(JSVGScrollPane scroll) {
>               this.scroll = scroll;
>       }
> }
> 
> --- Cameron McCormack <[EMAIL PROTECTED]> schrieb am Mi,
> 28.5.2008:
> Von: Cameron McCormack <[EMAIL PROTECTED]>
> Betreff: Re: Repainting a JSVGCanvas
> An: [email protected]
> Datum: Mittwoch, 28. Mai 2008, 9:04
> 
> aaaa aaaa: > the problem is that I get occasionally a
> NullPointerException in the > ScrollListener of the
> JSVGCanvas. The variable "newview" is null in
> > the updateCompleted method .  Hmm.  I’m not sure
> what would cause getViewBoxRect() to return null if all you
> are doing is resizing, unless there’s a threading issue. 
> > Rectangle2D newview = getViewBoxRect(); >  > So
> sometimes the canvas gets white and it has to be repaint.
> It's > immediatly repainted when I resize the frame
> or when I'm using the > scrollbars. But I've
> inserted > > if (newview == null) { >
>                               
> canvas.getUpdateManager().getUpdateRunnableQueue().invokeLater(new
> Runnable() { >  >                                     @Override >             
>                         public void
> run() { >                                             canvas.repaint(); >     
>                                 } >  >
>                               }); >                           return; >       
>                 } >  > and this does
> not have any effect. Another solution maybe would be to >
> avoid to get the Exception. But I don't see what I'm
> doing wrong.  I don’t think calling canvas.repaint() is
> the right
>  thing to fix the problem.  It sounds like there is a
> problem with JSVGScrollPane or JSVGCanvas.  Are you able to
> provide a reduced test case that demonstrates the problem
> (perhaps just loading a small SVG document in a
> JSVGScrollPane/JSVGCanvas, where continually resizing it
> will trigger the bug)?  Thanks,  Cameron  --  Cameron
> McCormack ≝ http://mcc.id.au/ 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail:
> [EMAIL PROTECTED] For
> additional commands, e-mail:
> [EMAIL PROTECTED]
> 
> 
>      
> __________________________________________________________
> Gesendet von Yahoo! Mail.
> Dem pfiffigeren Posteingang.
> http://de.overview.mail.yahoo.com
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail:
> [EMAIL PROTECTED]
> For additional commands, e-mail:
> [EMAIL PROTECTED]


      __________________________________________________________
Gesendet von Yahoo! Mail.
Dem pfiffigeren Posteingang.
http://de.overview.mail.yahoo.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to