Skip to main content

Mixing property language support and bean bindings

Posted by forax on September 24, 2007 at 3:14 PM PDT

Recently, Shannon posts version 1.0 of beanbindings, even
if this version is not ready for production use,
it is stable enough to create a small demo mixing
property language support and
beanbindings.

The idea is to create a bean (here MyBean) with a bound
property (label) and to bind this property to two different
textfields.

properties-meet-bindings.png

Defining a bean

Because i use the property support directly integrated in the language,
defining such bean is easy. AbstractBean provides the
basic support for managing property change listeners.

 public static class MyBean extends AbstractBean {
    property String label bound;
   
    private <B,T> void propertyChanged(java.lang.Property<B,T> property,Object oldValue,Object newValue) {
      firePropertyChange(property,oldValue,newValue);
    }
   
    @Override
    public String toString() {
      return "label "+label;
    }
  }

Wrap the property to someting understandable

By default bean bindings only supports two kinds of property
bean property that uses bean introspector and
EL property that uses EL script but
the framework is easily extensible and let you create
your own property implementation.

So i've created a new kind of property (here LangProperty)
that exposes a java.lang.Property as a property understandable
by the bindings framework.

And mix

And now mixing the language support and
the API together is as simple as that:

    LangProperty<MyBean,String> labelProperty =
        LangProperty.create(MyBean#label);
   
    JLabel label = new JLabel("Label:");
    JTextField field = new JTextField(20);
    Bindings.createAutoBinding(READ_WRITE,
        bean, labelProperty,
        field, BeanProperty.create("text")).bind();
   
    JLabel anotherLabel = new JLabel("Another label:");
    JTextField anotherField = new JTextField(20);
    Bindings.createAutoBinding(READ_WRITE,
        bean, labelProperty,
        anotherField, BeanProperty.create("text")).bind();

The notation sharp ('#') is used to get an objet
typed java.lang.Property that allow to get and set
the value of the property.

Want to test it

You want to test it by yourself, ok, here a zip containing
the code, the beanbindings jar and the javac.jar patched to
understand properties.


Download properties-meets-bindings.zip

Use this line to compile

 java -Xbootclasspath/p:javac.jar com.sun.tools.javac.Main -XDallowProperty -cp beansbinding-1.0.jar *.java

And this one to execute

 java -Xbootclasspath/p:javac.jar -cp .:beansbinding-1.0.jar Sample

You must include javac.jar at runtime only because it
contains the class java.lang.Property
and i am too lazy to create two jars.

WARNING, i have re-written the bound property support in the patched
compiler last night so i think it will not work
on another example :)

Cheers,


Rémi

Related Topics >>