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]
