У меня возникла проблема с отображением моего SVG-чертежа в приложении диаграмм. Холст принимает размер своего родительского компонента, а не содержащий его документ. Документы, размер которых превышает этот размер, не полностью отображаются.Сделать JSVGCanvas внутри JSVGScrollPane соответствует размеру SVGDocument
Case
У меня есть рисунок, который, например, 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
, родительский элемент scrollpane меньше, чем документ, скажем, его 500x500 пикселей.
Ожидаемое поведение
При запуске приложения часть чертежа, который помещается в 500x500 видна. Основной документ больше, поэтому есть полосы прокрутки, которые позволяют мне прокручивать 121px влево и ниже.
Когда вы увеличиваете размер рамки, становится все больше и больше чертежа. Когда вы увеличите его до 620x620px, полосы прокрутки могут полностью исчезнуть.
Если вы сделаете панель меньше, чем документ снова, появятся полосы прокрутки.
Встречающиеся поведение
При запуске приложения часть чертежа, который помещается в 500x500 видна. Прокрутки не видны.
Когда вы делаете панель большей, холст увеличивается (его цвет фона), но рисунок не распространяется на часть, которая находится за пределами начального 500x500px.
Когда вы делаете панель меньшей, скажем, 400x400, появляются полосы прокрутки, но позволяют мне прокручивать 100 пикселей. Таким образом, холст все еще является исходным 500x500 вместо желаемого 621x621.
Пример
встреченного поведение может быть воспроизведен с ScrollExample
на хранилище Батика и 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
. Предполагается, что резервные копии в коде Batik отсутствуют, поэтому я надеюсь, что это необязательно. Кроме того, когда я где-то подправлен, он должен сохранять это панорамирование, если я изменю документ.
Надеюсь, я сделаю свою проблему понятной. Я ожидаю слишком много из JSVG-классов, когда я ожидаю, что они предоставят мое желаемое поведение из коробки или я что-то пропустил? Может ли кто-нибудь помочь мне в решении?