[Binding] comboviewer et propriété objet.
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.
:
Code:
1 2 3 4 5 6
| public class RefQualite extends ModelObject implements Persist<String>
{
private String codeQualite;
private String libelleQualite;
//.. accesseurs etc...
} |
Cette classe est une propriété d'un classe agent :
Code:
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....
} |
J'ai chopper ModelObjet sur le net :
Code:
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()));
}
} |
Coté UI, je crée le comboviewer ainsi :
Code:
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();
}
} |
Et après j'associe un agent à cette derniere, je fais un binding comme ça :
Code:
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); |
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.
Toute aide sera la bienvenue :P.