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 :

[Richfaces] Datatable et Sélection


Sujet :

JSF Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut [Richfaces] Datatable et Sélection
    Bonjour,

    J'ai un problème simple mais pas évident à résoudre.

    J'ai une datatable et je veux appeller une méthode lors d'une sélection (l'utilisateur clique sur une ligne du tableau).

    Normalement, la ligne sélectionnée change de couleur et on peut utiliser l'attribut selection de la datatable pour stocker la valeur dans un bean. Le problème, c'est qu'on ne peut pas appeller une méthode lors d'une sélection.

    J'utilise donc un composant CommandLink dans ma table pour contourner le problème. Cette méthode a 2 inconvénients:
    - La ligne n'est pas visuellement sélectionnée (logique vu qu'il n'y a pas eu de sélection)
    - Il faut cliquer sur quelque chose de précis et non sur la ligne du tableau (problème mineur mais ce serait un plus de le résoudre)

    J'ai essayé d'utiliser <a4j:support> pour appeller une méthode lors d'une sélection mais ça ne marche pas.

    Est-il possible de sélectionner une ligne via le bean? (ceci serait une solution acceptable puisque ça résoudrait le problème visuel)

    Est-il possible d'activer une méthode lors d'une sélection? (ce serait la meilleur solution)

    J'ai beaucoup cherché mais rien trouvé à ce sujet.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Par défaut
    Bonjour.

    Tu peux le faire en passant par une fonction javascript sur le onRowClick du rich:datatable.
    Ensuite dans ta méthode javascript tu peux utiliser Seam.Component.getInstance('ton composant seam').taMéthode();

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    Merci, je vais tester ça

  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
    Citation Envoyé par aigleborgne Voir le message
    Bonjour,

    J'ai un problème simple mais pas évident à résoudre.

    J'ai une datatable et je veux appeller une méthode lors d'une sélection (l'utilisateur clique sur une ligne du tableau).

    Normalement, la ligne sélectionnée change de couleur et on peut utiliser l'attribut selection de la datatable pour stocker la valeur dans un bean. Le problème, c'est qu'on ne peut pas appeller une méthode lors d'une sélection.
    tu parles d'une méthode coté serveur ou coté client, tu peux faire les deux, avec a4j:support.
    Citation Envoyé par aigleborgne Voir le message
    J'utilise donc un composant CommandLink dans ma table pour contourner le problème. Cette méthode a 2 inconvénients:
    - La ligne n'est pas visuellement sélectionnée (logique vu qu'il n'y a pas eu de sélection)
    - Il faut cliquer sur quelque chose de précis et non sur la ligne du tableau (problème mineur mais ce serait un plus de le résoudre)

    J'ai essayé d'utiliser <a4j:support> pour appeller une méthode lors d'une sélection mais ça ne marche pas.

    Est-il possible de sélectionner une ligne via le bean? (ceci serait une solution acceptable puisque ça résoudrait le problème visuel)

    Est-il possible d'activer une méthode lors d'une sélection? (ce serait la meilleur solution)

    J'ai beaucoup cherché mais rien trouvé à ce sujet.
    pour récupérer la ligne séléctionnée, 3 solutions sont proposées sur la .

    tu peux ajouter un boolean à l'objet de tes lignes, et ajouter un booleanCheckBox dans la table, si tu clique sur une ligne tu aura la valeur du boolean a true.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    Je veux appeller une méthode côté serveur, située dans mon controlleur.
    J'avais déjà partiellement utilisé les solutions de la FAQ mais elles ne sont pas suffisantes.

    En effet, que ce soit un commandlink ou un commandbutton, on détourne la sélection d'une ligne par un bouton ou un lien. De fait, la ligne n'est pas visuellement sélectionnée.

    Dans mon écran, j'ai un ensemble de datatables qui sont liées. Chaque sélection dans une table entraine une requête pour déterminer le contenu de la suivante.
    Par exemple, 3 tables région, département, et ville. Lorsqu'on clique sur une région, la région sélectionnée est mise en évidence dans la table et on affiche la table département.

    L'utilisateur doit visuellement voir la ligne qu'il a sélectionné. Et pour ça, la sélection naturelle du composant me va très bien (un fond gris clair sur toute la ligne du tableau).

    Mais si on passe par un commandlink, rien n'est sélectionné! La table département est correctement affichée mais c'est tout. De plus, l'utilisateur doit bien cliquer sur le texte du lien ou sur le bouton. Or la sélection naturelle se fait en cliquant n'importe où sur la ligne, c'est mieux!

    La solution de Monstor me semble idéale, je la testerai lundi car je bosse sur un autre projet cette semaine
    Je n'avais pas vu de propriété onRowClick sur un datatable, ou je n'ai peut être pas su la faire fonctionner.
    Quant à Seam, je ne connais pas du tout.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2008
    Messages : 152
    Par défaut
    Par contre, si tu n'utilises pas Seam, regardes comment appeler une fonction de ton bean depuis du code javascript, là je ne peut pas t'aider

    Bonne chance

  7. #7
    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
    si tu fais les traitements ligne par ligne, et que tu n'a pas besoin de sélection multiple tu peux utiliser rich:contextMenu.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 9
    Par défaut Récupérer un élément depuis une dataTable et Appeler une méthode avec un paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <rich:dataTable value="#{bean.liste}" var="element">
    		<rich:column>
    			<a4j:support event="onclick">
    				<a4j:actionparam name="action" value="#{element}" assignTo="#{bean.méthode}"/>
    			</a4j:support>
    			<h:outputText value="#{element}"/>
    		</rich:column>
    	</rich:dataTable>
    la méthode appelé "bean.methode" doit se présenter sous la forme d'un accesseur (le mutateur n'est pas indispenssable) et prend 1 paramètre du même type que "element".

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    J'ai testé l'exemple de digital_versatil et ça ne marche pas.

    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	<rich:extendedDataTable var="marque" value="#{vehiculeCtrl.marques}" width="150px" height="250px" 
    	  sortMode="#{extendedTableBean.sortMode}" selectionMode="single" binding="#{vehiculeCtrl.uiMarque}" selection="#{vehiculeModel.marque}">
    	  	   <rich:column sortable="true" sortBy="#{marque.libelle}" sortOrder="ASCENDING" width="130px">
    	       <f:facet name="header">
    	           <h:outputText value="Marque"/>
    	       </f:facet>
             <a4j:support event="onclick">
                <a4j:actionparam name="action" value="#{marque.id}" assignTo="#{vehiculeCtrl.marque}"/>
             </a4j:support>
             <h:outputText value="#{marque.libelle}" />
             <h:graphicImage width="25px" height="25px" url="#{marque.urlLogo}" />
    	   </rich:column>
    	</rich:extendedDataTable>
    Du côté du bean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class VehiculeCtrl {
     
    	private UIData uiMarque;
    	private UIData uiModele;
     
       [...]
     
    	public void setMarque(String id){
    		uiModele.setRendered(true);
    	}
     
     
    }
    J'ai mis un point d'arrêt pour voir si la méthode est appelée mais il ne se passe rien.
    Je vais regarder pour les autres réponses, mais je ne sais pas si je peux intégrer Seam dans mon projet, ce n'est pas moi qui décide.

  10. #10
    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
    Je ne comprend pas ce que tu veux faire exactement,
    tu utilise extendedDataTable tu as la paramètre selection pour récupérer les lignes sélectionnées, pourquoi ajouter un a4j:actionparam?
    seam propose une liste de composants mais c'est beaucoup plus que ça, et richfaces doit largement répondre à ton besoin..

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    Le paramètre selection sert simplement à attribuer ma sélection dans ma classe model. Ensuite, je veux appeler une méthode qui va effectuer un traitement.

    On sélectionne une ligne:
    1. La valeur sélectionnée est stockée dans une classe.
    2. On effectue un traitement (conséquences fonctionnelles)

    En pratique, même la propriété "selection" ne marche pas.
    J'ai même tenté de mettre selection="#{vehiculeCtrl.marque}" mais aucune réaction non plus.

    Quoique je fasse, un clic sur une ligne ne déclenche rien.

  12. #12
    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
    Citation Envoyé par aigleborgne Voir le message
    Le paramètre selection sert simplement à attribuer ma sélection dans ma classe model. Ensuite, je veux appeler une méthode qui va effectuer un traitement.

    On sélectionne une ligne:
    1. La valeur sélectionnée est stockée dans une classe.
    2. On effectue un traitement (conséquences fonctionnelles)

    En pratique, même la propriété "selection" ne marche pas.
    J'ai même tenté de mettre selection="#{vehiculeCtrl.marque}" mais aucune réaction non plus.

    Quoique je fasse, un clic sur une ligne ne déclenche rien.
    1 - pourquoi tu utilise extendedDataTable, c'est un nouveau composant qui est cours de finalisation et de test, tu peux utiliser scrollableDataTable qui permet la selection multiple, sinon, le composant le plus stable est dataTable, pour la sélection multiple, tu peux ajouter un booleanCheckBox pour la sélection et tu peux aussi mettre les lignes sélectionnées en surbrillance.
    2- tu as regardé sur la documentation comment utiliser la propriété sélection? y'a aussi selectionClass pour donner la classe des lignes sélectionnés.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    Parce que ce composant permet de choses intéressantes comme le regroupement et il a donc été retenu par le client.

    J'ai finalement réussi à appeler une méthode. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<rich:extendedDataTable var="marque" value="#{vehiculeCtrl.marques}" width="150px" height="250px" 
    	  sortMode="#{extendedTableBean.sortMode}" selectionMode="single" binding="#{vehiculeCtrl.uiMarque}">
       <a4j:support event="onRowClick" actionListener="#{vehiculeCtrl.selectionMarque}" reRender="modele" />	  
    	  	   <rich:column sortable="true" sortBy="#{marque.libelle}" sortOrder="ASCENDING" width="130px">
     
    	       <f:facet name="header">
    	           <h:outputText value="Marque"/>
    	       </f:facet>
             <h:graphicImage width="25px" height="25px" url="#{marque.urlLogo}" />
             <h:outputText value="#{marque.libelle}" />
    	   </rich:column>
    	</rich:extendedDataTable>
    Ceci marche parfaitement. Il me reste à récupérer la sélection dans ma méthode et affecter la valeur dans mon modèle. :-)

    Merci pour toutes les infos, elles m'ont été utiles.

    Citation Envoyé par Sniper37 Voir le message
    1 - pourquoi tu utilise extendedDataTable, c'est un nouveau composant qui est cours de finalisation et de test, tu peux utiliser scrollableDataTable qui permet la selection multiple, sinon, le composant le plus stable est dataTable, pour la sélection multiple, tu peux ajouter un booleanCheckBox pour la sélection et tu peux aussi mettre les lignes sélectionnées en surbrillance.
    2- tu as regardé sur la documentation comment utiliser la propriété sélection? y'a aussi selectionClass pour donner la classe des lignes sélectionnés.

  14. #14
    Invité de passage
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Par défaut
    Citation Envoyé par aigleborgne Voir le message
    Parce que ce composant permet de choses intéressantes comme le regroupement et il a donc été retenu par le client.

    J'ai finalement réussi à appeler une méthode. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	<rich:extendedDataTable var="marque" value="#{vehiculeCtrl.marques}" width="150px" height="250px" 
    	  sortMode="#{extendedTableBean.sortMode}" selectionMode="single" binding="#{vehiculeCtrl.uiMarque}">
       <a4j:support event="onRowClick" actionListener="#{vehiculeCtrl.selectionMarque}" reRender="modele" />	  
    	  	   <rich:column sortable="true" sortBy="#{marque.libelle}" sortOrder="ASCENDING" width="130px">
     
    	       <f:facet name="header">
    	           <h:outputText value="Marque"/>
    	       </f:facet>
             <h:graphicImage width="25px" height="25px" url="#{marque.urlLogo}" />
             <h:outputText value="#{marque.libelle}" />
    	   </rich:column>
    	</rich:extendedDataTable>
    Ceci marche parfaitement. Il me reste à récupérer la sélection dans ma méthode et affecter la valeur dans mon modèle. :-)

    Merci pour toutes les infos, elles m'ont été utiles.
    Salut,

    As-tu finalement réussi à récupérer la sélection au niveau de ta méthode?
    Je bute actuellement sur le même problème...

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

Discussions similaires

  1. RichFaces : Datatable et menu contextuel + clic droit
    Par sebastiens57 dans le forum JSF
    Réponses: 3
    Dernier message: 03/06/2009, 09h41
  2. richfaces: datatable filtre
    Par adamo901 dans le forum JSF
    Réponses: 7
    Dernier message: 05/01/2009, 21h15
  3. Richface Datatable et sélection d'une ligne
    Par aigleborgne dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 18/12/2008, 11h59
  4. JSF Richfaces datatable
    Par seddik_saber dans le forum JSF
    Réponses: 2
    Dernier message: 16/09/2008, 11h42
  5. Réponses: 1
    Dernier message: 07/07/2008, 10h58

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