You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@pivot.apache.org by Josh Highley <jo...@gmail.com> on 2016/04/13 20:26:51 UTC

Populate ListButton with enum data binding ?

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

Re: Populate ListButton with enum data binding ?

Posted by Josh Highley <jo...@gmail.com>.
Yes, that works.  Knowing that BXMLSerializer needs no-arg constructors is
helpful.

Thanks,

Josh


On Thu, Apr 14, 2016 at 2:18 PM, Roger Whitcomb <Ro...@actian.com>
wrote:

> 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:joshhighley@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 <
> RogerandBeth@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
>
>
>
>
>

RE: Populate ListButton with enum data binding ?

Posted by Roger Whitcomb <Ro...@actian.com>.
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:joshhighley@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 <Ro...@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



Re: Populate ListButton with enum data binding ?

Posted by Josh Highley <jo...@gmail.com>.
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 <
RogerandBeth@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
>>
>>
>

Re: Populate ListButton with enum data binding ?

Posted by Roger and Beth Whitcomb <Ro...@rbwhitcomb.com>.
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
>