i have a .svg file to create a Map which will have Listeners relevant to boundaries (i guess its called “nodes” of a scalable vector graphic). However, i’m trying to add this file as a BufferedImage over a JPanel. (i’m a newbie about swing components so if you have any better ideas please share ). Moreover, i used Batik library and read some information about it and i used this code sample to get this .svg file as BufferedImage
package org.pulpcore.tools.res; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.batik.dom.svg.SVGDOMImplementation; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.TranscodingHints; import org.apache.batik.transcoder.image.ImageTranscoder; import org.apache.batik.util.SVGConstants; import org.apache.commons.io.FileUtils; public class SVGRasterizer { /** Rasterizes an SVG file using Batik. @param svgFile The svg file. @return The rasterized image. @throws IOException if the svg file could not be rasterized. */ public static BufferedImage rasterize(File svgFile) throws IOException { final BufferedImage[] imagePointer = new BufferedImage[1]; // Rendering hints can't be set programatically, so // we override defaults with a temporary stylesheet. // These defaults emphasize quality and precision, and // are more similar to the defaults of other SVG viewers. // SVG documents can still override these defaults. String css = "svg {" + "shape-rendering: geometricPrecision;" + "text-rendering: geometricPrecision;" + "color-rendering: optimizeQuality;" + "image-rendering: optimizeQuality;" + "}"; File cssFile = File.createTempFile("batik-default-override-", ".css"); FileUtils.writeStringToFile(cssFile, css); TranscodingHints transcoderHints = new TranscodingHints(); transcoderHints.put(ImageTranscoder.KEY_XML_PARSER_VALIDATING, Boolean.FALSE); transcoderHints.put(ImageTranscoder.KEY_DOM_IMPLEMENTATION, SVGDOMImplementation.getDOMImplementation()); transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT_NAMESPACE_URI, SVGConstants.SVG_NAMESPACE_URI); transcoderHints.put(ImageTranscoder.KEY_DOCUMENT_ELEMENT, "svg"); transcoderHints.put(ImageTranscoder.KEY_USER_STYLESHEET_URI, cssFile.toURI().toString()); try { TranscoderInput input = new TranscoderInput(new FileInputStream(svgFile)); ImageTranscoder t = new ImageTranscoder() { @Override public BufferedImage createImage(int w, int h) { return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); } @Override public void writeImage(BufferedImage image, TranscoderOutput out) throws TranscoderException { imagePointer[0] = image; } }; t.setTranscodingHints(transcoderHints); t.transcode(input, null); } catch (TranscoderException ex) { // Requires Java 6 //throw new IOException("Couldn't convert " + svgFile, ex); ex.printStackTrace(); throw new IOException("Couldn't convert " + svgFile); } finally { cssFile.delete(); } return imagePointer[0]; } }
this is my class to use GUI components and the part where i try to use BufferedImage
import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.swing.JFrame; import javax.swing.JPanel; public class JRisk { private JFrame mainMap; public JRisk() throws IOException{ initComponents(); } private void initComponents() throws IOException{ mainMap = new JFrame(); mainMap.setResizable(false); JPanel mainPanel = new JPanel(); File riskMap = new File("src\src\risk.svg"); BufferedImage bufImage = SVGRasterizer.rasterize(riskMap); mainMap.setIconImage(bufImage); mainMap.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainMap.add(mainPanel); mainMap.pack(); mainMap.setVisible(true); } }
and finally, Test program which contains main method.
import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.SwingUtilities; public class Test { /** * @param argsh */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { try { new JRisk(); } catch (IOException ex) { Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex); } } }); } }
Well my problem is compiler gives an error which is
Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/w3c/dom/svg/SVGDocument
and the whole error is
at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:791) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) at org.apache.batik.dom.svg.SVGDOMImplementation.createDocument(Unknown Source) at org.apache.batik.dom.util.SAXDocumentFactory.startElement(Unknown Source) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:602) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3063) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:881) at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607) at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116) at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) at org.apache.batik.dom.util.SAXDocumentFactory.createDocument(Unknown Source) at org.apache.batik.dom.util.SAXDocumentFactory.createDocument(Unknown Source) at org.apache.batik.dom.svg.SAXSVGDocumentFactory.createDocument(Unknown Source) at org.apache.batik.dom.svg.SAXSVGDocumentFactory.createDocument(Unknown Source) at org.apache.batik.transcoder.XMLAbstractTranscoder.transcode(Unknown Source) at org.apache.batik.transcoder.SVGAbstractTranscoder.transcode(Unknown Source) at src.SVGRasterizer.rasterize(SVGRasterizer.java:74) at src.JRisk.initComponents(JRisk.java:31) at src.JRisk.<init>(JRisk.java:17) at src.Test$1.run(Test.java:24) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705) at java.awt.EventQueue.access$000(EventQueue.java:101) at java.awt.EventQueue$3.run(EventQueue.java:666) at java.awt.EventQueue$3.run(EventQueue.java:664) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:675) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105) at java.awt.EventDispatchThread.run(EventDispatchThread.java:90) Caused by: java.lang.ClassNotFoundException: org.w3c.dom.svg.SVGDocument at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:423) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:356) ... 51 more
i will be very very appreciated if you can help about this topic even with useful suggesstions! And thanks anyway
Advertisement
Answer
The following post my address your issue:
Batik not in classpath
It seems as if the jar file may not be included in the Batik download, you can just download the needed jar library and add it to your project.