2013-03-06 2 views
0

바운더리와 관련된 Listener (확장 가능한 벡터 그래픽의 "노드"라고 생각 함)가있는 Map을 만들기위한 .svg 파일이 있습니다. 그러나 JPanel 위에 BufferedImage로이 파일을 추가하려고합니다. (저는 스윙 구성 요소에 대한 초보자입니다. 더 좋은 아이디어가 있으면 공유하십시오.) 또한, 나는 Batik 라이브러리를 사용하고 대한 몇 가지 정보를 읽고 난 BufferedImage로서이 .svg 파일을 얻기 위해이 코드 샘플을 사용java.lang.NoClassDefFoundError BufferedImage로 svg 파일을 읽는 중

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]; 
    } 
} 

내가 BufferedImage를 사용하려고 곳이 내 GUI 구성 요소를 사용하는 클래스와 부분이다

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); 
    } 

} 

그리고 최종적으로 주 방법을 포함하는 시험 프로그램.

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); 
         } 
      } 
     }); 
    } 
} 

그럼 내 문제는 컴파일러는

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: org/w3c/dom/svg/SVGDocument 

이며, 당신도이 주제에 대해 도움을 줄 수있는 경우 전체 오류가 난 아주 아주 이해할 수있을 것이다

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 

을 오류를 준다 유용한 제안과 함께! 덕분 어쨌든

+0

IDE 또는 명령 줄을 통해 프로그램을 어떻게 실행하고 있습니까? 수업 경로는 어떻게 생겼습니까? – Byron

+0

Netbeans에서 실행하고 프로젝트에 .jar 파일을로드했습니다. – quartaela

+1

이 게시물을 보셨나요? 어쩌면 당신은 당신이 필요로하는 항아리를 다운로드하여 프로젝트에 추가 할 수 있습니다 : http://stackoverflow.com/questions/7891250/batik-not-in-classpath – Byron

답변

1

다음 포스트 내 주소 문제는 :
Batik not in classpath

jar 파일이 바틱 다운로드에 포함되지 않을 수 있습니다 것처럼 보인다, 당신은 단지 필요한 항아리 라이브러리를 다운로드에 추가 할 수 있습니다 귀하의 프로젝트.

0

xml-apis.jar 및/또는 xml-apis-ext.jar을 추가하십시오. 그것은 나를 위해 일했다.