다이어그램 작성 응용 프로그램에서 SVG 도면을 표시하는 데 문제가 있습니다. 캔버스는 포함 된 문서 대신 상위 구성 요소의 크기를 사용합니다. 이 크기보다 큰 문서는 완전히 렌더링되지 않습니다.JSVGScrollPane 내의 JSVGCanvas를 SVGDocument 크기와 일치 시키십시오.
케이스
I는, 예를 들면 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입니다.
예
만난 동작은 바틱 저장소와 나는 위에서 추가 한 SVG 파일에 ScrollExample
재현 할 수 있습니다. 이 예에서는 고정 크기 인 500x500 픽셀을 사용합니다.
배경색을 캔버스와 스크롤 패널에 추가하는 경우 전체 프레임이 파란색입니다. 따라서 캔버스의 크기가 커지면 초기 크기를 초과하여 그려지지 않습니다.
canvas.setBackground(Color.blue);
scroller.setBackground(Color.red);
패널의 크기를 조정하면 문서를 재설정 할 수 있습니다. 이렇게하면 도면의 보이는 부분을 다시 그릴 수 있지만 캔버스가 여전히 문서 크기가 아닌 보이는 부분의 크기이기 때문에 스크롤이 예상대로 작동하지 않습니다. 이 리스너를 프레임 (또는 내가 생각하는 다른 패널)에 추가하여 테스트 할 수 있습니다.나는이 뷰 박스가 있어야하지만, 내 문서 (A modelchange 이벤트를 기반으로) 자주 다시 내가 문서를 작성하고있을 때, 내가 뷰 박스 얻는 방법을 모르는 읽고
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
}
// ...
};
. SVGDocument.getRootElement().getBBox();
은 보통 null
입니다. viewBox가 주어지지 않았을 때 Batik 코드에 대체물이 있어야하기 때문에 이것은 선택 사항입니다. 또한 어딘가에서 이동하면 문서를 변경하면이 이동을 유지해야합니다.
나는 내 문제를 분명히하고 싶습니다. JSVG 클래스가 너무 많아 기대했던 동작을 상자에서 꺼내기를 기대하거나 여기에 뭔가 빠졌습니까? 누군가 나를 해결책으로 이끌 수 있습니까?