J'ai un comboViewer que je cherche à baser sur une classe metier RefQualite.
Sa sélection initiale (ou celle de la combo associée) n'est pas correcte.
Les changement de l'UI semble bien impacter les classes metier, mais l'UI n'est pas correctement initialisé (la liste de choix est ok, mais sans sélection) au moment binding UI/objet metier.
:Cette classe est une propriété d'un classe agent :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 public class RefQualite extends ModelObject implements Persist<String> { private String codeQualite; private String libelleQualite; //.. accesseurs etc... }J'ai chopper ModelObjet sur le net :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public class Agent extends ModelObject implements Persist<Integer> { private String matriculeNG; private Integer idAgent; private RefQualite qualite; private String nom; private String prenom; private Date dateNaissance; private String adresse; private String codePostal; private String ville; private RefPays pays; private String telephone; private String email; private RefMetier metier; private RefStatutMetier statutMetier; //... accesseurs etc.... }Coté UI, je crée le comboviewer ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ModelObject { private PropertyChangeSupport propertyChangeSupport = new PropertyChangeSupport( this); private String id; 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); } protected void firePropertyChange(String propertyName, int oldValue, int newValue) { propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } protected void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) { propertyChangeSupport.firePropertyChange(propertyName, oldValue, newValue); } public void setId(String string) { Object oldValue = id; id = string; firePropertyChange("id", oldValue, id); } protected Object[] append(Object[] array, Object object) { List newList = new ArrayList(Arrays.asList(array)); newList.add(object); return newList.toArray((Object[]) Array.newInstance(array.getClass() .getComponentType(), newList.size())); } protected Object[] remove(Object[] array, Object object) { List newList = new ArrayList(Arrays.asList(array)); newList.remove(object); return newList.toArray((Object[]) Array.newInstance(array.getClass() .getComponentType(), newList.size())); } }
Et après j'associe un agent à cette derniere, je fais un binding comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 /** * This method initializes qualiteCombo * */ private void createQualiteCombo() { qualiteCombo = new Combo(infoAdminGroup, SWT.DROP_DOWN | SWT.READ_ONLY); qualiteComboViewer = new ComboViewer(qualiteCombo); try { List<RefQualite> refQualiteList = DataModelManager.getInstance().getAll(RefQualite.class); //Ajout d'une ligne vide dans la combo refQualiteList.add(0,new RefQualite()); qualiteComboViewer.setLabelProvider(new LabelProvider(){ public String getText(Object arg0) { RefQualite refQualite = ((RefQualite)arg0); if(refQualite==null) return ""; else return refQualite.getLibelleQualite(); } }); qualiteComboViewer.setContentProvider(new ArrayContentProvider()); qualiteComboViewer.setInput(refQualiteList); } catch (SQLException e) { e.printStackTrace(); } }La combo UI ne se place pas initialement sur la bonne valeur, alors que les changement on bien l'air d'être répercuter coté model métier, l'UI n'est pas alimenté par le model métier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 protected void bind(Agent agt) { //S'il y avait un binding précédent on le supprime //pour éviter que l'interface n'écrite sur le nouvel agent if(dbc!=null) { dbc.dispose(); } //sinon on ajoute un listener qui "disposera" le binding à la suppression // du composant parant. else { this.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { dbc.dispose(); } }); } dbc =new DataBindingContext(); // On associe chaque composant UI à une propriété de l'instance courante // d'agent //ceci pose pb, ici 'qualite' est une instance de classe RefQualite dbc.bindValue(ViewersObservables.observeSingleSelection(qualiteComboViewer), BeansObservables.observeValue(agt, "qualite"), null, null); //ceci fonctionne mais 'matricule' n'est qu'une simple class String dbc.bindValue(SWTObservables.observeText(matriculeText, SWT.Modify|SWT.FocusOut), BeansObservables.observeValue(agt, "matricule"), null, null);
Toute aide sera la bienvenue.
Partager