Ceci est une ancienne révision du document !
JFace Data binding
JFace permet de mettre en place un système permettant de mettre à jour les interfaces sur modification du modèle, et de mettre à jour le modèle, depuis la modification d'une interface :
-- Création du modèle
Sur le principe, chaque modèle va émettre un évènement sur modification de ses membres, évènement communiqué aux listeners associés au modèle.
-- Classe de base AbstractModel
La classe AbstractModel va permettre d'ajouter des listeners associés à des membres, et de déclencher des événements. Toute classe intégrée au modèle et utilisant le Data binding devra hériter de AbstractModel.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public abstract class AbstractModelObject { private final PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport( this ); public void addPropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(listener); } public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.addPropertyChangeListener(propertyName, listener); } public void removePropertyChangeListener(PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(listener); } public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { propertyChangeSupport.removePropertyChangeListener(propertyName, listener); } protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) { propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } } |
-- Création d'un Model
Création d'une classe Utilisateur :
- Utilisateur doit être un Bean (constructeur+getters/setters)
- Hériter de AbstractModel
- Appeler firePropertyChange sur la modification de ses membres
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public class Utilisateur extends AbstractModelObject { private String nom; private int age; public Utilisateur() { } public Utilisateur(String nom, int age) { this .nom = nom; this .age = age; } /** * @return the nom */ public String getNom() { return nom; } /** * @param nom * the nom to set */ public void setNom(String nom) { String oldValue = this .nom; this .nom = nom; firePropertyChange( "nom" , oldValue, nom); } /** * @return the age */ public int getAge() { return age; } /** * @param age * the age to set */ public void setAge( int age) { int oldValue = this .age; this .age = age; firePropertyChange( "age" , oldValue, age); } } |
-- Création d'une vue
-- Implémentation du code
Implémenter les méthodes suivantes, puis tester l'interface
1 2 3 4 5 6 7 |
btnNewButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { user.setNom( "DUPONT-LAJOIE" ); user.setAge( 25 ); } }); |
1 2 3 4 5 6 |
btnAfficher.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { lblUtilisateur.setText(user.toString()); } }); |
-- Définition du binding
Code généré :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
protected DataBindingContext initDataBindings() { DataBindingContext bindingContext = new DataBindingContext(); // IObservableValue observeTextTextNameObserveWidget = WidgetProperties.text(SWT.Modify).observe(textName); IObservableValue namePersonObserveValue = BeanProperties.value( "nom" ).observe(user); bindingContext.bindValue(observeTextTextNameObserveWidget, namePersonObserveValue, null , null ); // IObservableValue observeSelectionSpinnerObserveWidget = WidgetProperties.selection().observe(spinnerAge); IObservableValue ageUserObserveValue = BeanProperties.value( "age" ).observe(user); bindingContext.bindValue(observeSelectionSpinnerObserveWidget, ageUserObserveValue, null , null ); // return bindingContext; } |
Tester l'interface créée et son comportement