So, the technical reason you go the error is that BXMLSerializer must be able 
to find a simple no-arg constructor for the class (in this case EnumList) in 
order to construct it, before adding data elements using the “add” method.  
There is no such constructor for EnumList (nor could there be, since it is a 
generic class and would need at least the class as a parameter in order to 
specialize it).

So, one thing that comes to mind (and I haven’t tested it to see if works) 
would be to make a simple class of your own, that pretty much just “wraps” an 
EnumList<Paint.Color>.  Not sure exactly how you would code it, but by 
providing a no-arg constructor and implementing the “List<?>” interface it 
should meet the requirements and be able to be used.  So, presumably you could 
do something like this:
public class ColorList extends EnumList<Paint.Color> {
                public ColorList() {
                                super(Paint.Color.class);
}
}
Then in your BXML file, use:
<ListButton selectedItemKey="exteriorColor">
    <listData>
        <mypackage:ColorList/>
    </listData>
</ListButton>

Again, I haven’t tried this, but I *think* it should work (or something 
reasonably close to this).

HTH,
~Roger

From: Josh Highley [mailto:joshhigh...@gmail.com]
Sent: Thursday, April 14, 2016 10:38 AM
To: user@pivot.apache.org
Subject: Re: Populate ListButton with enum data binding ?

Yes, populating in Java is a last resort.  Where possible, I've been trying to 
keep code like that out of the Java code.  I'm converting a QT Jambi app, and 
all of the UI definition code in Java makes it a mess trying to find where 
functionality is actually implemented.

At this point, my stacktrace isn't really valid since I don't know now to pass 
the required Class param to EnumList.  Another path I may explore is using 
ArrayList and passing the Paint.Color.values() array -- I'm not sure if there's 
a way to do this in bxml....

Thanks,

Josh


On Thu, Apr 14, 2016 at 12:20 PM, Roger and Beth Whitcomb 
<rogerandb...@rbwhitcomb.com<mailto:rogerandb...@rbwhitcomb.com>> wrote:
That is a really good question, Josh.  My first thought is that you will 
probably have to populate the list in Java code.  My second thought is to poke 
through the BXMLSerializer code to see it I can figure it out.  But, what was 
the complete stack trace of the SerializationException (i.e., the cause).  That 
could point the way to a solution.  But, at the moment I don't know the answer.

Thanks,
~Roger


On 4/13/16 11:26 AM, Josh Highley wrote:
I'm having an issue doing data binding with bxml.  My app has a Dialog with a 
Form that shows a lot of editable fields for an object.  Using form.load(new 
BeanAdapter(myObject)) is working for most of the fields (TextInput and 
Checkbox) but I'm having trouble with ListButton.  I want to populate the 
listData with values from an enum and then set the selected item from a 
myObject value. I can't figure out how to specify the enum for the list data in 
the bxml. I think I'm close:

(simplified example to mirror actual app)

public class Paint {
   public enum Color { RED, BLUE, GREEN }
}

public class Car {
    private Paint.Color color;

    public Paint.Color getExteriorColor() { return color; }
    public void setExteriorColor(Paint.Color color) { this.color = color; }
}

<ListButton selectedItemKey="exteriorColor">
    <listData>
        <collections:EnumList>
     <!-- how do I specify constructor parameter Paint.Color class here? -->
        </collections:EnumList>
    </listData>
</ListButton>


I tried 'enumClass' as an attribute of <EnumList> and a child element, but I 
always get an "org.apache.pivot.serialization.SerializationException" on the 
line with <collections:EnumList>


Thanks,

Josh


Reply via email to