【问题标题】:Can I create a JSVGCanvas without an svg file?我可以在没有 svg 文件的情况下创建 JSVGCanvas 吗?
【发布时间】:2015-08-29 17:47:14
【问题描述】:

查看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 解决方案可以工作

【问题讨论】:

    标签: java swing svg jython batik


    【解决方案1】:

    是的,您可以:

    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。但是,我们滥用它并给它一个空字符串,并从我们的 svg-data 字符串中将InputStream 设为流。

    使用"" 可能会抛出关于它们不是协议的异常,具体取决于蜡染的版本。如果是这样的话,试试"file:///",也就是给它一个是谎言的URI。您可能想要使用实际的 URI;你需要找出一个有效的给蜡染

    【讨论】:

    • 在 Batik 1.6 版中,这会导致 org.apache.batik.dom.svg.SAXSVGDocumentFactory.createDocument() 处出现“java.io.IOException: no protocol:”
    • @tucuxi 听起来 uri 需要更多信息。也许试试file:/// 之类的东西(可能之后有一条假路径
    • 我可以确认使用“file:///”而不是“”可以正常工作(来自 Maven Central 的蜡染 1.6)
    • 在 batik 1.10 上,它既适用于 "" 也适用于 "file:///"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多