à toi de voir comment rendre le unique cette chaine..
tu peux utiliser pour le nom, une chaine qui représente le nom et, mais à l'affichage, afficher que le nom..
Version imprimable
Tu remontrer ton code actuel ? Parce que ton comportement n'est pas normal. Le nom de l'utilisateur ne doit servir qu'en tant que label, et donc uniquement affiché visuellement sur ta page. Le combobox, ainsi que ton converter, ne doivent travailler qu'avec des ID...
Ok. je remontre mon code :
code du converter
code getUserlist()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 public class UserConverter implements Converter { /** * */ public UserConverter() { // TODO Auto-generated constructor stub } /* (non-Javadoc) * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String) */ public Object getAsObject(FacesContext context, UIComponent component, String name) { FrmUserBean frmUserBean = (FrmUserBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "frmUserBean"); for(Utilisateur utilisateur : frmUserBean.getUser_list()){ if((utilisateur.getNom()).equals(name)){ return utilisateur; } } return null; } /* (non-Javadoc) * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object) */ public String getAsString(FacesContext context, UIComponent component, Object value) { Utilisateur user = (Utilisateur) value; String name = user.getNom(); return name; } }
et l'utilisation dans ma page .xhtmlCode:
1
2
3
4
5
6
7
8 public List<SelectItem> getUserlist() { userlist.clear(); for(Utilisateur user : getUser_list()){ userlist.add(new SelectItem(user, user.getNom())); } return userlist; }
Code:
1
2
3
4
5
6 <rich:comboBox immediate="true" directInputSuggestions="true" disabled="#{frmUserBean.invetat }" width="230" id="comboUser" value="#{frmUserBean.utilisateur }" converter="userConverter"> <f:selectItems value="#{frmUserBean.userlist }"/> <a4j:support event="onselect" action="#{frmUserBean.onSelectUser }" reRender="user_panel, crudUser, rechuser" ajaxSingle="true"> </a4j:support> </rich:comboBox>
Ton converteur ne doit pas travailler avec les noms, car ils peuvent être dupliqués (ce qui est ton cas), mais bien avec les ID de l'objet User, qui lui est unique...
Ton converter doit ressembler à ça :
Sinon, tu as une autre solution : au lieu de passer par un converteur, tu ne travailles qu'avec ton ID :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public Object getAsObject(FacesContext context, UIComponent component, String id) { if (id == null) { // Cas où aucun utilisateur est choisi. return null; } FrmUserBean frmUserBean = (FrmUserBean) context.getApplication().getELResolver().getValue(context.getELContext(), null, "frmUserBean"); for (Utilisateur utilisateur : frmUserBean.getUser_list()) { if (utilisateur.getId().equals(id)) { return utilisateur; } } return null; } public String getAsString(FacesContext context, UIComponent component, Object value) { if (value == null) { return null; } return ((Utilisateur) value).getId(); }
Dans le bean :
Et dans le code JSF :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 private String userChoisiId; // + getter et setter public List<SelectItem> getUserlist() { userlist.clear(); for (Utilisateur user : getUser_list()) { userlist.add(new SelectItem(user.getId(), user.getNom())); } return userlist; } private Utilisateur getUserFromId(String id) { if (id == null) { return null; } for (Utilisateur user : getUser_list()) { if (user.getId().equals(id)) { return user; } } return null; } public String doSomething() { if (userChoisiId != null) { Utilisateur u = getUserFromId(userChoisiId); ... } ... }
Code:
1
2
3 <rich:comboBox id="comboUser" value="#{frmUserBean.userChoisiId}"> <f:selectItems value="#{frmUserBean.userlist }"/> </rich:comboBox>
Merci Romaintaz de me répondre. J'avais déjà testé cette méthode et je viens encore de le faire. Il marche très bien à l'exception du fait qu'au lien de mettre dans mon combobox, le user.getNom() commandé dans getUserlist(), il m'affiche l'identifiant.
J'ai l'impression qu'il n'arrive pas du tout à récupérer le label de SelectItem.
et dans le fichier .xhtmlCode:
1
2
3
4
5
6
7
8 public List<SelectItem> getUserlist() { userlist.clear(); for(Utilisateur user: getUser_list()){ userlist.add(new SelectItem(user.getId(), user.getNom())); } return userlist; }
exactement comme tu l'as fait. Où est ce que j'ai gaffé? je n'arrive pas à comprendre.Code:
1
2
3
4
5
6
7
8 <rich:comboBox width="200" id="comboNomMed" directInputSuggestions="true" disabled="#{frmDiversBean.invetat}" value="#{frmDiversBean.medId}"> <f:selectItems value="#{frmDiversBean.medecinlist }"/> <a4j:support event="onselect" action="#{frmDiversBean.onSelectMed }" reRender="medecin_panel, crudMed, nom_panel" ajaxSingle="true"> </a4j:support> </rich:comboBox>
getUserlist() c'est ton getMedecinlist() ou pas ?
Je dis ça parce que dans ton code tu as : <f:selectItems value="#{frmDiversBean.medecinlist }"/>
Oui oui, j'ai juste oublié de remplacer dans le code que je t'ai envoyé. Je travaille en fait sur une table Medecin, mais comme j'avais commencé à vous présenter le problème avec une table utilisateur, je préfère continuer ainsi.
J'ai écris ce code afin d'afficher la liste des utilisateurs, je voulais être sûre que le SelectItem fonctionne bien. Apparemment, pas de soucis. Il tient bien compte du value et du label. Les valeurs s'affichent bien.
Alors, pourquoi le label ne s'affiche pas dans le combo, mais plutot le value? Mystère !Code:
1
2 for(SelectItem item : getUserlist()){ System.out.println(item.getValue() + " - " + item.getLabel());}
Ah. En fait il y a un souci :
When using selectItem(s) for suggestion definition you should define only value of the selectItem. It is used both for displaying and storing.
(vu ici)
Autrement dit, le <rich:combobox> ne gère que l'ID du SelectItem et pas le label :(
Oui, je vois. Je suis donc obligée d'utiliser un h:selectonemenu, si je veux faire ça. :?. ça tue le design de mon appli.
Merci pour ton aide Romaintaz.
Oui, c'est sûr que c'est moins chouette. J'avoue être assez étonné et ne pas bien comprendre pourquoi ils ignorent les labels (le JIRA créé chez JBoss n'est pas explicite)...
Il a essayé avec le suggestionValues?
Qu'est ce que tu proposes avec les suggestionvalues?
non ça ne risque pas de marcher ..
tu peux utiliser suggestionBox..ça ressemble plus à un inputText avec possibilité d'auto-completion.
mais, le problème est de faire de trouver le User juste avec le nom, donc, tu peux sans utiliser le converter, prendre le nom..pour la recherche de ton objet, tu ajoutes une information dont tu dispose ..date de naissance ou autre chose..