Hi Tom,
Michael's comments are entirely correct, you need to wait for the
first rendering before you can be sure that the CSS properties have
be cascaded. But I Wanted to point out some problems with your code...
"Tom McCallum" <[EMAIL PROTECTED]> wrote on 04/09/2007
12:04:31 PM:
> Currently I do the following (am just playing at the moment!) to create
my
> rectangle:
> DOMImplementation domImpl
> =SVGDOMImplementation.getDOMImplementation();
>
> // Create an instance of org.w3c.dom.Document.
> String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
> SVGDocument doc = (SVGDocument) domImpl.createDocument(svgNS,
> "svg", null);
> svgCanvas.setSVGDocument(doc); // set the document for the
JSVGCanvas object
The 'setSVGDocument' call is asynchronous so for a while after this
call
the canvas will be working on the document in a separate thread. Since
the
DOM is not thread safe the following code is very problematic.
To do this properly set the document up first then call
setSVGDocument.
(more further down).
> // Get the root element (the 'svg' element).
> Element svgRoot = doc.getDocumentElement();
>
> // Set the width and height attributes on the root 'svg'
element.
> svgRoot.setAttributeNS(null, "width", "1000");
> svgRoot.setAttributeNS(null, "height", "500");
>
> // Create the rectangle.
> Element rectangle = doc.createElementNS(svgNS,
> SVGConstants.SVG_RECT_TAG );
> rectangle.setAttributeNS(null, "x", "10");
> rectangle.setAttributeNS(null, "y", "20");
> rectangle.setAttributeNS(null,
SVGConstants.SVG_WIDTH_ATTRIBUTE,
> "100");
> rectangle.setAttributeNS(null,
SVGConstants.SVG_HEIGHT_ATTRIBUTE,
> "50");
> rectangle.setAttributeNS(null, "fill", "red");
>
> svgRoot.appendChild(rectangle);
> I then (sometime later) retrieve the color via:
> String color = domElement.getAttributeNS(null,
> SVGConstants.SVG_FILL_ATTRIBUTE);
Any interaction with the DOM tree should only be done in the
Canvas's runnableQueue (See FAQ for details). You may need to
set the canvas to ALWAYS_DYNAMIC (also see FAQ for details), so
the runnable queue becomes available after the first rendering...
This should avoid problem down the road when you run the
code on a faster or multi-CPU machine...
> which gives me back a string ("#FF0000").
>
> Now I could assume that this would always be the hex representation as I
> am building the tree in the first place, but I would rather know how to
do
> this more cleanly taking into account the four color representations:
> // fill="cornflowerblue"
> // fill="rgb(100, 149, 237)"
> // fill="#6495ED"
> // fill="aliceblue"
>
> Any ideas?
>
> Tom
>
>
> On Mon, 09 Apr 2007 16:52:13 +0100, Bishop, Michael W. CONTR J9C880
> <[EMAIL PROTECTED]> wrote:
>
> > Are you using a JSVGCanvas? You might want to check the wiki on the
> > Batik site about booting CSS and DOM. JSVGCanvas does this for you.
If
> > you don't use one, you have to do it manually. Even though you're not
> > setting CSS values for color, a CSS is "computed" through the magic of
> > Batik (I'm sure someone can explain this much better) and you need
these
> > pieces loaded to use that functionality:
> >
> > http://wiki.apache.org/xmlgraphics-batik/BootSvgAndCssDom
> >
> > Michael Bishop
> >
> >
> >
> > -----Original Message-----
> > From: Tom McCallum [mailto:[EMAIL PROTECTED]
> > Sent: Monday, April 09, 2007 10:12 AM
> > To: [email protected]
> > Subject: Another Color Question
> >
> > From a previous post I found I have a function to get the colour of
an
> >
> > element as follows:
> >
> > public static Color getColor(Element element, String attribute) {
> > Color returnColor = null;
> > final Document document = element.getOwnerDocument();
> > if ( document != null ) {
> > //System.out.println("doc.getDocumentElement:
> > "+document.getDocumentElement().getClass().toString());
> > final ViewCSS viewCSS = (ViewCSS)
> > document.getDocumentElement();
> > if ( viewCSS != null ) {
> > final CSSStyleDeclaration computedStyle =
> > viewCSS.getComputedStyle(element, null);
> > if ( computedStyle != null ) {
> > System.out.println("CSS Text:
> > "+computedStyle.getCssText());
> > final SVGPaint svgPaint =
> > (SVGPaint)
> > computedStyle.getPropertyCSSValue(attribute);
> > if ( svgPaint != null ) {
> > if (svgPaint.getPaintType() ==
> > SVGPaint.SVG_PAINTTYPE_RGBCOLOR) {
> > final RGBColor rgb =
> > svgPaint.getRGBColor();
> > final float red =
> > rgb.getRed().getFloatValue(CSSValue.CSS_PRIMITIVE_VALUE);
> > final float green =
> > rgb.getGreen().getFloatValue(CSSValue.CSS_PRIMITIVE_VALUE);
> > final float blue =
> > rgb.getBlue().getFloatValue(CSSValue.CSS_PRIMITIVE_VALUE);
> > returnColor = new Color(red / 255, green
/
> >
> > 255, blue / 255);
> > }
> > }
> > }
> > }
> > }
> > return returnColor;
> > }
> >
> > I have a simple SVG which creates a coloured rectangle:
> >
> > <?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"
> > width="1000" zoomAndPan="magnify" contentStyleType="text/css"
> > height="500"
> > preserveAspectRatio="xMidYMid meet" version="1.0"><rect fill="#ff0000"
> > x="100" width="100" y="100" height="50"/></svg>
> >
> > Unfortunately I cannot get the colour of the rectangle back to a
> > java.awt.Color object, as I get the following exception:
> >
> > Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
> > at
> > org.apache.batik.css.dom.CSSOMComputedStyle.getCssText(Unknown
> > Source)
> > at ataglancedemo.SVGUtils.getColor(SVGUtils.java:56)
> > at ataglancedemo.GlanceRect.getBackground(GlanceRect.java:93)
> > at ataglancedemo.MainFrame.test4(MainFrame.java:84)
> > at ataglancedemo.MainFrame.<init>(MainFrame.java:213)
> > at ataglancedemo.Main$1.run(Main.java:29)
> > at
> > java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
> > at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
> > at
> >
java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThrea
> > d.java:242)
> > at
> >
java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.
> > java:163)
> > at
> > java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
> > at
> > java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
> > at
> > java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
> >
> > Can anyone tell me how to get the background color in all
circumstances,
> >
> > i.e. when it is just an attribute or if as a CSS?
> >
> > Many thanks
> >
> > Tom
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail:
[EMAIL PROTECTED]
>
>
>
> --
> Using Opera's revolutionary e-mail client: http://www.opera.com/mail/
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]