我可以创建没有 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
翻了翻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