Java 我可以创建没有svg文件的JSVGCanvas吗?

Java 我可以创建没有svg文件的JSVGCanvas吗?,java,swing,svg,jython,batik,Java,Swing,Svg,Jython,Batik,从照片上看,我似乎无法做到这一点。然而,这是非常有意义的,这是可能的。如何从字符串变量而不是文件创建JSVGCanvas 我的想法是我可以做如下事情: String svg = "svg data"; JFrame frame = new JFrame(); JSVGCanvas canvas = new JSVGCanvas(); canvas.setContentsFromString(svg); frame.add(canvas); frame.setVisible(true); 我知道

从照片上看,我似乎无法做到这一点。然而,这是非常有意义的,这是可能的。如何从
字符串
变量而不是
文件
创建
JSVGCanvas

我的想法是我可以做如下事情:

String svg = "svg data";
JFrame frame = new JFrame();
JSVGCanvas canvas = new JSVGCanvas();
canvas.setContentsFromString(svg);
frame.add(canvas);
frame.setVisible(true);
我知道我总是可以创建一个临时文件,并从该文件中设置
JSVGCanvas
的内容,但我宁愿避免这样做。我是否可以扩展
文件
并覆盖其方法

注意:我使用的是Jython,但我认为这也与Java相关,因此我使用这两个标记。我希望解决方案采用Java,但Jython解决方案会起作用

是的,您可以:

String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
SVGDocument document = factory.createSVGDocument("", new ByteArrayInputStream(svg.getBytes("UTF-8")));

canvas.setSVGDocument(document);
这是通过
SAXSVGDocumentFactory
创建
SVGDocument
实现的
SAXSVGDocumentFactory
有一个方法,其中字符串应该是
InputStream
表示的文件的URI。但是,我们滥用了它,给它一个空字符串,并使
InputStream
成为来自svg数据字符串的流


根据Batik的版本,使用
可能会抛出一个关于它们没有协议的异常。如果是这种情况,请尝试
“file:///”
,也就是说,给它一个URI,它是一个谎言。您可能希望使用实际的URI;在Batik的1.6版上,您需要找到一个有效的文件给Batik,这会导致org.apache.Batik.dom.svg.SAXSVGDocumentFactory.createDocument()@tucuxi上出现“java.io.IOException:no protocol:”的uri需要更多信息。也许可以尝试类似于
文件://
(在我可以确认在batik 1.10上使用“file:///”而不是“工作正常”(来自Maven Central的batik 1.6)后,可能会有一个假路径,它既可以与“file://”一起工作,也可以与“file://”一起工作