我在图表应用程序中显示我的 SVG 绘图时遇到问题。画布采用其父组件的大小,而不是它包含的文档。大于此大小的文档不会完全呈现。
案子
例如,我有一张 621x621 像素的绘图。
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" zoomAndPan="magnify" contentStyleType="text/css" preserveAspectRatio="xMaxYMax slice" version="1.0">
<rect x="50" y="50" fill="white" width="20" height="20" stroke="black" stroke-width="1"/>
<rect x="600" y="600" fill="blue" width="20" height="20" stroke="black" stroke-width="1"/>
</svg>
它没有 viewBox,因为它是动态创建的。当我创建文档时,我没有大小。
我有一个JSVGCanvas
内部 a JSVGScrollPane
,滚动窗格的父级比文档小,可以说它的 500x500 像素。
预期行为
当您启动应用程序时,可以看到适合 500x500 的绘图部分。底层文档更大,所以有滚动条允许我向左和向下滚动 121px。
当您增加框架的大小时,越来越多的绘图变得可见。当您将其增加到大于 620x620px 时,滚动条会完全消失。
如果再次使面板比文档小,滚动条会重新出现。
遇到的行为
当您启动应用程序时,可以看到适合 500x500 的绘图部分。没有可见的滚动条。
当您使面板变大时,画布会增加(其背景颜色),但绘图不会扩展到初始 500x500px 之外的部分。
当您将面板缩小时,假设为 400x400,滚动条会出现,但只允许我滚动 100 像素。所以画布仍然是最初的 500x500 而不是所需的 621x621。
例子
ScrollExample
可以使用Batik 存储库和我在上面添加的 SVG 文件来重现遇到的行为。该示例使用 500x500px 的固定大小。
如果您将背景颜色添加到画布和滚动窗格,则整个框架都是蓝色的。因此,虽然画布确实增加了大小,但它不会绘制超出其初始大小的任何内容。
canvas.setBackground(Color.blue);
scroller.setBackground(Color.red);
重新调整面板大小后,我可以重置文档。这使得它重新绘制绘图的可见部分,但滚动仍然无法按预期工作,因为画布仍然只是可见部分的大小而不是文档的大小。您可以通过将此侦听器添加到框架(或我想的任何其他面板)来测试这一点。
class ResizeListener implements ComponentListener {
JSVGCanvas canvas;
URI url;
public ResizeListener(JSVGCanvas c, URI u) {
canvas = c;
url = u;
}
@Override
public void componentResized(ComponentEvent arg0) {
canvas.setURI(url.toString());
// Calling invalidate on canvas or scroller does not work
}
// ...
};
我已经读过我应该有一个 viewBox,但是我的文档经常重新创建(基于 modelchange 事件),当我创建文档时,我不知道如何获取 viewBox。SVGDocument.getRootElement().getBBox();
通常给我null
。当没有给出 viewBox 时,蜡染代码中应该有后备,所以我希望这是可选的。此外,当我在某处平移时,如果我更改文档,它应该保持这种平移。
我希望我能把我的问题说清楚。当我期望 JSVG 类提供开箱即用的所需行为时,我是否期望它们太多,或者我在这里遗漏了什么?有人可以指导我找到解决方案吗?