Re: batik not updating when resizing
Rubén Pérez <[email protected]>
| Newsgroups | gmane.text.xml.batik.user |
|---|---|
| Message-ID | <[email protected]> |
Hi,
Sorry again.
I still having some problems.... Let me paste you again this part of the
code:
private JSVGCanvas buildArrow() {
try {
String parser = XMLResourceDescriptor.getXMLParserClassName();
SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
URI uri =
this.getClass().getResource("/com/myapp/app/dicomview/player/arrow.svg").toURI();
final SVGDocument doc = (SVGDocument)
f.createDocument(uri.toString());
Element svgRoot = doc.getDocumentElement();
* svgRoot.setAttributeNS(null, "width", String.valueOf(50));*
final JSVGCanvas arrow=new JSVGCanvas();
add(arrow, BorderLayout.EAST);
arrow.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
//arrow.setOpaque(true);
arrow.setVisible(true);
arrow.setSVGDocument(doc);
* arrow.setSize(200,200); //this is a random size!*
arrow.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
System.out.println("Rendering completed!");
System.out.println("size: " + arrow.getSize());
System.out.println("prefSize: " +
arrow.getPreferredSize());
System.out.println("width: " +
arrow.getSVGDocument().getDocumentElement().getAttributeNS(null, "width"));
System.out.println("x: " +
arrow.getSVGDocument().getDocumentElement().getAttributeNS(null, "y"));
System.out.println("isDynamic: " + arrow.isDynamic());
System.out.println("arrow: " + arrow);
revalidate();
}
});
return arrow;
} catch (Throwable ex) {
ex.printStackTrace(System.out);
ErrorReport.process(ex);
return null;
}
}
Do you see the setSize in bold? it's settings the Canvas to a random
size before it gets rendered. When it gets rendered it will set to 50
(which is what I used in the DOM), the question is, why if I remove that
setSize, my SVG gets rendered in a wrong and moved location (sometimes)?
Regards!
Ruben
On 09/01/2013 1:36, DeWeese Thomas wrote:
> Hi Ruben,
> In general Batik will do that, it's just that you got unlucky. We
> don't support trying to change the width and height of the container
> after the document is loaded (it's not entirely clear if it's needed
> by the SVG spec), if you think about it you should be able to see that
> handling changes inside the canvas is quite different from changes
> inside the document affecting how the swing component holding the
> document is laid out in the swing tree (not to mention that the swing
> tree doesn't make it easy to change layout like this).
>
> Changing the color of elements in the document can be done this way
> and they will automatically render themselves.
>
> Thomas
>
> On Jan 7, 2013, at 8:19 PM, Rubén Pérez <[email protected]
> <mailto:[email protected]>> wrote:
>
>> Hi,
>>
>> Thanks for your response.
>>
>> I think I got Batik wrong, sorry I'm noob with DOM and Batik. I was
>> expecting Batik to intercept the events from DOM, so it is aware when
>> something in the XML changed and render what needed again. Can't I do
>> that? Then if I want to change, lets say the colour of my form, what
>> would be the proper way to achieve that? Do I really need to override
>> all the internal Canvas functions that performs the render of my object?
>>
>> Thanks
>> Ruben
>>
>>
>>
>>
>> On 01/08/2013 12:23 AM, DeWeese Thomas wrote:
>>> Hi Ruben,
>>> I think this is really late to be setting the width of the root
>>> SVG element. If you want to go this route you would probably need
>>> to load the XML yourself, update the width and then pass the XML DOM
>>> to the canvas.
>>>
>>> Alternately I would suggest overriding setMySize on the
>>> JSVGCanvas so that it ignores the size from the SVG document so that
>>> it is statically sized (well really just respecting the normal Swing
>>> layout rules).
>>>
>>> Thomas
>>>
>>> On Jan 7, 2013, at 9:22 AM, Rubén Pérez <[email protected]
>>> <mailto:[email protected]>> wrote:
>>>
>>>> Hello,
>>>>
>>>> I'm in Mac (I read there are some problems in Mac so it might be
>>>> actually my problem, but I'd like to confirm that with you guys).
>>>>
>>>> I have a JPanel with a BorderLayout in which I have added on the
>>>> EAST area a JSVGCanvas loading a small arrow (originally on the
>>>> file is 65px width). I want to load that arrow but resized to 100px.
>>>>
>>>> I simply can't achieve this. When I run my code, the JSVGCanvas
>>>> measures 69px width instead of the 100px, and there is nothing on
>>>> it, it's just the panel empty with my orange background.
>>>>
>>>> Here is basically what I'm doing:
>>>>
>>>>
>>>> private void changeWidth(final JSVGCanvas form, final int size) {
>>>> Runnable cmd=new Runnable() {
>>>> public void run() {
>>>> Element svgRoot = form.getSVGDocument().getDocumentElement();
>>>> svgRoot.setAttributeNS(null, "width", String.valueOf(size));
>>>> }
>>>> };
>>>>
>>>> form.getUpdateManager().getUpdateRunnableQueue().invokeLater(cmd);
>>>> }
>>>>
>>>> private JSVGCanvas buildArrow() {
>>>> try {
>>>> String parser = XMLResourceDescriptor.getXMLParserClassName();
>>>> SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
>>>> URI uri =
>>>> this.getClass().getResource("/com/myapp/app/dicomview/player/arrow.svg").toURI();
>>>> final SVGDocument doc = (SVGDocument) f.createDocument(uri.toString());
>>>> Element svgRoot = doc.getDocumentElement();
>>>> final JSVGCanvas arrow=new JSVGCanvas();
>>>>
>>>> arrow.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
>>>> arrow.setOpaque(true);
>>>> arrow.setVisible(true);
>>>>
>>>> Color inst=new Color(Color.orange.getRed(),
>>>> Color.orange.getGreen(), Color.orange.getBlue(), 75);
>>>> arrow.setBackground( inst );
>>>> arrow.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {
>>>> @Override
>>>> public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
>>>> changeWidth(arrow, 100);
>>>> }
>>>> });
>>>>
>>>> arrow.setSVGDocument(doc);
>>>>
>>>> add(arrow, BorderLayout.EAST);
>>>>
>>>> repaint();
>>>> return arrow;
>>>> } catch (Throwable ex) {
>>>> ex.printStackTrace(System.out);
>>>> ErrorReport.process(ex);
>>>> returnnull;
>>>> }
>>>> }
>>>>
>>>>
>>>>
>>>> Can anybody please give me a hint in what could be going wrong?
>>>>
>>>> Thanks!
>>>> Ruben
>>>
>>
>