ダイアグラム作成アプリケーションで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
内部にJSVGScrollPane
、スクロールペインの親がドキュメントよりも小さい、たとえば500x500ピクセルがあります。
期待される動作
アプリケーションを起動すると、500x500に収まる図面の部分が表示されます。基になるドキュメントが大きいので、121px左下にスクロールできるスクロールバーがあります。
フレームのサイズを大きくすると、より多くの図面が表示されます。620x620pxより大きくすると、スクロールバーが完全に消えることがあります。
パネルをドキュメントよりも小さくすると、スクロールバーが再び表示されます。
遭遇した行動
アプリケーションを起動すると、500x500に収まる図面の部分が表示されます。スクロールバーは表示されません。
パネルを大きくすると、キャンバス(背景色)は大きくなりますが、描画は最初の500x500pxの外側の部分には拡張されません。
パネルを小さくすると、たとえば400x400の場合、スクロールバーは表示されますが、100pxしかスクロールできません。したがって、キャンバスは、目的の621x621ではなく、最初の500x500のままです。
例
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-eventに基づいて)、ドキュメントを作成しているときに、viewBoxを取得する方法がわかりません。SVGDocument.getRootElement().getBBox();
通常私に与えますnull
。viewBoxが指定されていない場合、Batikコードにフォールバックがあるはずなので、これがオプションであることを願っています。また、どこかでパンした場合、ドキュメントを変更してもこのパンを維持する必要があります。
問題を明確にしたいと思います。JSVGクラスの多くが、箱から出して希望の動作を提供することを期待しているのでしょうか、それともここで何かが足りないのでしょうか。誰かが私を解決策に導いてくれませんか?