Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Binding issue between POJO properties and JavaFX components

1020434Aug 9 2013 — edited Aug 9 2013

Currently, what I want to do is use bidirectionnal binding between POJO properties and JavaFX components.

For example, if the property is a String, a Textfield will be generated and binded with it.

My POJOs are generated by JAXB.

To do that, I proceeded as followed :

  • In order to make the binding works I changed the default generation of JAXB
  • I created a factory which takes a class instance at input and return a Map containing the POJO properties as key and the JavaFX components as value
  • I displayed this map in a JFXPanel

Here is a sample of the factory  :

public static Map<Field, Node> createComponents(Object obj) throws NoSuchMethodException

   {

           Map<Field, Node> map = new LinkedHashMap<Field, Node>();

           for (final Field field : obj.getClass().getDeclaredFields())

           {

               @SuppressWarnings("rawtypes")

               Class fieldType = field.getType();

               if (fieldType.equals(boolean.class) || (fieldType.equals(Boolean.class))) //Boolean

               {

                   map.put(field, createBool(obj, field));

               }

               else if (fieldType.equals(int.class) || (fieldType.equals(Integer.class))) //Integer

               {

                  map.put(field, createInt(obj, field));

               }

               else if (fieldType.equals(BigInteger.class)) //BigInteger

               {

                  map.put(field, createBigInt(obj, field));

               }

               else if (fieldType.equals(long.class) || fieldType.equals(Long.class)) //Long

               {

                  map.put(field, createLong(obj, field));

               }

               else if (fieldType.equals(String.class)) //String

               {

                  map.put(field, createString(obj, field));

               }

           }

           return map;  

   }

public static Node createBool(Object obj, final Field field) throws NoSuchMethodException
{

  
System.out.println(field.getType().getSimpleName() + " spotted");
  
JavaBeanBooleanProperty boolProperty = JavaBeanBooleanPropertyBuilder.create().bean(obj).name(field.getName()).build();
  boolProperty
.addListener(new ChangeListener<Boolean>() {
  
@Override
  
public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2)
  
{
  prettyPrinter
(field, arg1, arg2);
  
}
  
});
  
CheckBox cb = new CheckBox();
  cb
.setText(" : " + field.getName());
  cb
.selectedProperty().bindBidirectional(boolProperty);
  
return cb;}

So, the problem I have is : Sometimes the binding will work and sometimes it won't. For example, the binding is working unless I changed the declaration property order in the POJO, or unless I resized the panel where components are displayed.

Does anybody have an idea of what I am doing wrong ?

Thanks,

Bastien

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Sep 6 2013
Added on Aug 9 2013
1 comment
585 views