slam4:gui:jfacebinding

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 :

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.

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.

net.model.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'une classe Utilisateur :

  • Utilisateur doit être un Bean (constructeur+getters/setters)
  • Hériter de AbstractModel
  • Appeler firePropertyChange sur la modification de ses membres

net.model.Utilisateur
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éer la classe FormUtilisateur, à partir de l'assistant SWT/window Application

Implémenter les méthodes suivantes, puis tester l'interface
Bouton Créer par défaut
1
2
3
4
5
6
7
btnNewButton.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        user.setNom("DUPONT-LAJOIE");
        user.setAge(25);
    }
});

Bouton Afficher
1
2
3
4
5
6
btnAfficher.addSelectionListener(new SelectionAdapter() {
    @Override
    public void widgetSelected(SelectionEvent e) {
        lblUtilisateur.setText(user.toString());
    }
});

Code généré :

Data binding
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

  • slam4/gui/jfacebinding.1364430200.txt.gz
  • Dernière modification : il y a 6 ans
  • (modification externe)