Okay, I found the problem.  It is rather technical, but basically here’s what’s 
happening:

1)      When, in BXML, you specify a child element that starts with a Capital 
Letter, this is instantiated as an object (in this case NumericSpinnerData), 
which is then attached to the parent *somehow* (and therein lies the rub).  If 
the parent has a DefaultProperty annotation, then a BeanAdapter is created for 
the parent, and the DefaultProperty property is set.  For a Spinner, the 
DefaultProperty is “spinnerData” (as you would expect).

2)      But, inside BXMLSerializer if the value of the existing DefaultProperty 
property is a Sequence, then the child element is added via 
Sequence.add(child).  For a Spinner the initial spinner data is an empty 
ArrayList, which happens to be a Sequence, and so the NumericSpinnerData is 
added as an element of the ArrayList.  Thus the value turns into the 
“toString()” value of the NumericSpinnerData object (which is its class name).  
So, instead of setting the NumericSpinnerData object itself as the spinner 
data, it simply adds it to the original ArrayList.

3)      This can be worked around by either using the <spinnerData> as the 
enclosing element in BXML or by instantiating the NumericSpinnerData in Java 
code and calling “setSpinnerData” with it.

 

So, I can see two possible solutions:

a)      The Spinner tutorial code (in 
tutorials/src/org/apache/pivot/tutorials/boundedrange/spinners.bxml) actually 
has this code, which is why it works:

 

        <Spinner preferredWidth="40" selectedIndex="0">

            <spinnerData>

                <content:NumericSpinnerData lowerBound="0" upperBound="9" 
increment="1"/>

            </spinnerData>

        </Spinner>

 

                But, the associated display code in tutorials/www/spinners.xml 
only has this:

                    <Spinner preferredWidth="40" selectedIndex="0">

                        <content:NumericSpinnerData lowerBound="0" 
upperBound="9" increment="1"/>

                    </Spinner>

 

                Which doesn’t work because of the problem outlined above.

                So, we could/should change the displayed example code to be 
what actually works (i.e., change “spinners.xml” to match “spinner.bxml”, and 
add the actually required <spinnerData> element.

 

b)      And/or we could change the behavior of BXMLSerializer and/or change the 
default spinner data (from the “Spinner()” constructor) to be a non-sequence, 
and/or take out the DefaultProperty in Spinner.java so that <spinnerData> is 
really required.

 

At the very least we should correctly document what is required to make it work 
so that others aren’t confused, and then we can talk about step b) and what to 
do there (if anything).

 

HTH,

~Roger Whitcomb

Reply via email to