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

Can I create a JSVGCanvas without an svg file?

翻了翻documentation for JSVGCanvas,我好像做不到。但是,这很有意义。如何从 String 变量而不是 File 创建 JSVGCanvas

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

String svg = "svg data";
JFrame frame = new JFrame();
JSVGCanvas canvas = new JSVGCanvas();
canvas.setContentsFromString(svg);
frame.add(canvas);
frame.setVisible(true);

我知道我总是可以创建一个临时文件并从该文件中设置 JSVGCanvas 的内容,但我宁愿避免这样做。我可以扩展 File 并覆盖它的方法吗?

注:我使用的是 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 有一个方法 createSVGDocument(String, InputStream),其中字符串应该是 InputStream 代表的文件的 URI。然而,我们滥用它并给它一个空字符串,并使 InputStream 来自我们的 svg-data 字符串的流。

使用 "" 可能会引发关于它们没有协议的异常,具体取决于 Batik 的版本。如果是这样,试试"file:///",也就是给它一个骗人的URI。您可能想使用实际的 URI;你需要找出一个有效的给 Batik