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