IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Supprimer une entrée de h:selectOneListbox


Sujet :

JSF Java

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 110
    Par défaut Supprimer une entrée de h:selectOneListbox
    Bonjour à tous,

    Je veut supprimer une entrée de ma h:selectOneListbox.

    Voila mon code

    JSF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      <h:selectManyListbox value="#{referenceMB.SelectedTechnologie}"  >
               <f:selectItems value="#{referenceMB.listeTechnologies}" />
        </h:selectManyListbox>
    Managed Bean :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private int SelectedTechnologie;
    a partir de l'identifiant je récupère la Technologie et puis je l'ajoute dans une autre liste en utilisant la méthode add ( SelectItem s )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     tech=t.doFindTechnologie(selected);
     
      final SelectItem ld= new SelectItem(tech.getNotechnologie(),tech.getDescription(),note) ;
     
      this.listeReferenceTechnologies.add(ld);

    Mon probleme réside dans la suppression du SelectItem de la liste ...
    J'utilise la méthode remove(object o) qui prend en paramètre un objet pas un SelectItem comme pour l'ajout... et ca marche pas pour moi..
    Est ce qu'il ya une méthode de convertir un SelectItem en un objet...j'ai meme essayer de récupérer l'index du SelectItem et j'ai tombé sur le meme probleme.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     for (SelectItem i: listeTechnologies) {
    			if(i.getValue()==ld.getValue())
    			{
    		
    		listeTechnologies.remove(i);  // voila la ligne de l'erreur
    		    					
    			}
    Merci de m'aider.

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu dois redéfinir la méthode equals et hashcode du selectItem,

    tu peux le faire dans le constructeur.

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 110
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    tu dois redéfinir la méthode equals et hashcode du selectItem,

    tu peux le faire dans le constructeur.
    Dans quel constructeur? de mon managed Bean?
    Est ce que tu peut m'expliquer plus avec un bout de code? que je doit mettre dans ces deux méthode?

  4. #4
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu peux faire un truc dans le genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MonBean value = ..;
    		String libelle ..;
    		SelectItem s = new SelectItem(value,libelle) {@Override
    		public boolean equals(Object obj) {
    			// 
    			return  obj.getId() == value.getId();
     
    		}
    	};
    Sinon tu peux étendre la classe SelectItem et redéfinir la méthode equals.
    ou faire le remove à la main..une fonction qui enleve l'objet de la liste..

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 110
    Par défaut
    Citation Envoyé par Sniper37 Voir le message
    tu peux faire un truc dans le genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MonBean value = ..;
    		String libelle ..;
    		SelectItem s = new SelectItem(value,libelle) {@Override
    		public boolean equals(Object obj) {
    			// 
    			return  obj.getId() == value.getId();
     
    		}
    	};
    Sinon tu peux étendre la classe SelectItem et redéfinir la méthode equals.
    ou faire le remove à la main..une fonction qui enleve l'objet de la liste..
    OK j'ai comprit le principe... je vait essayer avec ca...Merci .

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 110
    Par défaut
    Bonjour,

    J'ai essayé de redéfinir la classe SelectItem et implémenter les méthode equals() et hashcode() mais j'avais la même erreur.

    Par contre j'ai trouvé une autre piste... Je récupère maintenant l'index de l'élément sélectionné en faisant un Cast pour convertir de int à Object.
    Ca marche bien pour moi , il récupère l'index..et supprime le SelectItem de la liste sauf que parfois il génère une exception :

    voila mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     for (SelectItem i: listeTechnologies) {
    			if(i.getValue()==ld.getValue())
    			{
    			int index=	listeTechnologies.indexOf((Object)i);
    			System.out.println("index est :"+index);
    	     	listeTechnologies.remove(index);
     
    			}
    		}
    et voila l'exception :

    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
     java.util.ConcurrentModificationException
    javax.faces.el.EvaluationException: java.util.ConcurrentModificationException
    	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
    	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
    	at javax.faces.component.UICommand.broadcast(UICommand.java:387)
    	at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
    	at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
    	at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
    	at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
    	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
    	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
    	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
    	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
    	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)
    	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:301)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
    	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)

  7. #7
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Tu ne peux pas supprimer un élément d'une liste sur laquelle tu es en train d'itérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (SelectItem i : listeTechnologies) {
        ...
        listeTechnologies.remove(xxx);
    }
    Tu peux passer par une liste intermédiaire par exemple (c'est pas top optimisé, je le reconnais, mais ça marche quand même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<SelectItem> toRemove = new ArrayList<SelectItem>();
    for (SelectItem i : listeTechnologies) {
        ...
        toRemove.add(i);
    }
    for (SelectItem i : toRemove) {
        listeTechnologies.remove(i);
    }
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  8. #8
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 110
    Par défaut
    Citation Envoyé par romaintaz Voir le message
    Tu ne peux pas supprimer un élément d'une liste sur laquelle tu es en train d'itérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (SelectItem i : listeTechnologies) {
        ...
        listeTechnologies.remove(xxx);
    }
    Tu peux passer par une liste intermédiaire par exemple (c'est pas top optimisé, je le reconnais, mais ça marche quand même) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List<SelectItem> toRemove = new ArrayList<SelectItem>();
    for (SelectItem i : listeTechnologies) {
        ...
        toRemove.add(i);
    }
    for (SelectItem i : toRemove) {
        listeTechnologies.remove(i);
    }
    Ah bon...
    J'ai trouvé un moyen plus pratique , vu que je supprime qu'un seul élément à la fois... j'ai déplacé la méthode remove() hors de la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      for (SelectItem i: listeTechnologies) {
    			if(i.getValue()==ld.getValue())
    			{
    		    index=	listeTechnologies.indexOf((Object)i);
    			System.out.println("index est :"+index);     		    					
    			}
    		}
          listeTechnologies.remove(index);
    Maintenant ca marche à merveille..... Merci pour ton aide

  9. #9
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Effectivement, si tu ne supprimes qu'un seul élément.
    Mais tu peux optimiser un peu ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = 0;
    int index = -1;
    while (i < listeTechnologies && index == -1) {
        SelectItem si = listeTechnologies.get(i);
        // Ton code...
        ...
        i++;
    }
    if (index != -1) {
        listeTechnologies.remove(index);
    }
    ça permet de ne parcourir la liste que jusqu'à ce que tu trouves ton élément à supprimer...
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  10. #10
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    110
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 110
    Par défaut
    Citation Envoyé par romaintaz Voir le message
    Effectivement, si tu ne supprimes qu'un seul élément.
    Mais tu peux optimiser un peu ta boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int i = 0;
    int index = -1;
    while (i < listeTechnologies && index == -1) {
        SelectItem si = listeTechnologies.get(i);
        // Ton code...
        ...
        i++;
    }
    if (index != -1) {
        listeTechnologies.remove(index);
    }
    ça permet de ne parcourir la liste que jusqu'à ce que tu trouves ton élément à supprimer...
    Ok , Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Supprimer une entrée d'une table sans casser les relations
    Par gvdmoort dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 05/10/2007, 13h02
  2. Réponses: 6
    Dernier message: 17/07/2007, 16h32
  3. [REG] Supprimer une entrée
    Par amirym dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 04/06/2007, 21h44
  4. Supprimer une entrée dans ajout suppression des programmes
    Par lavazavio dans le forum Windows XP
    Réponses: 5
    Dernier message: 01/05/2007, 18h30
  5. [Tableaux] Comment ajouter/supprimer une entrée d'un array
    Par dessinateurttuyen dans le forum Langage
    Réponses: 7
    Dernier message: 09/08/2006, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo