Thats funny, yesterday I worked with a friend on a simplification of the
jgoodies Bindings where we used a dynamic proxy
of the model to do the binding and the notifies in both directions afterwards.
It looked almost the same, just an slightly less verbose setup.
bindings.bindTo(new JTextField()).getLastName();
Michael
Niclas Hedhman schrieb:
> Gang,
> I am working on a demo of Qi4j + Swing, and looking at how to do widget
> bindings.
>
> Let's say we have;
>
> public interface Person
> {
> Property<String> firstName();
> Property<String> lastName();
> Property<Address> address();
> }
> public interface Address
> {
> Property<String> line1();
> Property<String> line2();
> :
> }
>
> // Swing "as usual"
> public class PersonPanel extends JPanel
> {
> public PersonPanel( StateModel<Person> model )
> {
> TextField tf1 = new TextField();
> add( tf1 );
> model.bind( model.firstName() ).to( tf1 );
>
> TextField tf3 = new TextField();
> add( tf3 );
> model.bind( model.address().get().line1() )
> .to( tf3 );
> }
> }
>
> Right now the StateModel is a normal class that needs to be created with the
> ObjectBuilder, but we are planning to make it into a Composite instead.
>
> Additionally, there are SwingAdapters which are responsible for the actual
> binding, and the requirements of those are;
>
> * implement SwingAdapter
> * be ServiceComposites
> * be visible from where the StateModel is used.
>
> The SwingAdapter looks like this;
>
> public interface SwingAdapter
> {
> Set<Pair> canHandle();
>
> void fromSwingToProperty( JComponent component, Property<?> property );
>
> void fromPropertyToSwing( JComponent component, Property<?> property );
>
> public class Pair
> {
> public Class<? extends JComponent> component;
> public Class<?> propertyType;
>
> public Pair( Class<? extends JComponent> component,
> Class<?> propertyType )
> {
> this.component = component;
> this.propertyType = propertyType;
> }
> }
> }
>
> All SwingAdapters will be looked up in the "bind" phase, and asked for which
> type and component combinations they can handle.
>
>
> The "use"-phase is when a Person instance is set to the StateModel, such as;
>
> StateModel<Person> model = .... ;
> PersonPanel panel = new PersonPanel( model );
> :
> :
> model.use( somePerson );
> :
> :
> model.use( someOtherPerson );
>
>
> Changes to the Property instance in "Person" will occur on focusLost events.
> There are no buffering, as it is expected that all objects modified are
> backed by a UnitOfWork.
>
>
> We don't want to commit the code to trunk, since trunk is unstable at the
> moment and the small sample can't be run. That is just a matter of... days?
> Until then, I will fix up Associations and ManyAssociations.
>
> Ok folks, WDYAT??
>
>
> This will all end up in a library, and this is a perfect project for YOU to
> get your hands dirty, since a lot of work is needed for the binding adapters.
>
>
> Cheers
_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev