la signature de actionListener:
tu peux utiliser action aussi pour les cas de navigation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part public void methodName(ActionEvent e);
donne le code que tu as testé et qui ne marche pas.
la signature de actionListener:
tu peux utiliser action aussi pour les cas de navigation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part public void methodName(ActionEvent e);
donne le code que tu as testé et qui ne marche pas.
bon j'ai essayé avec et sans f:setPropertyActionListener mais j'imagine que ca marche avec, c'est ce que tu fais textuellement dans ton tuto l'affichage dans un popup ^^
voilà le code maintenant :
pour la jsp :
et dans le bean
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 <form> <rich:modalPanel id="modif" minHeight="200" minWidth="450" height="200" width="500" > <f:facet name="header"> <h:outputText value="Modifier les informations de l'acteur" /> </f:facet> <f:facet name="controls"> </f:facet> <h:outputText value="#{contexte.acteurCourant.nom}" /> </rich:modalPanel> </form> <form> <rich:dataTable reRender="modif" onRowMouseOver="this.style.backgroundColor='#F1F1F1'" onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'" width="100%" var="acteurs" value="#{contexte.listeActeurs}"> <a4j:support reRender="modif" event="onRowDblClick" action="#{contexte.selectionLigne}" oncomplete="javascript:Richfaces.showModalPanel('modif')"> <f:setPropertyActionListener value="#{acteurs}" target="#{contexte.acteurCourant}"/> </a4j:support> <f:facet name="header"> <rich:columnGroup> <rich:column> <h:outputText value="Nom" /> </rich:column> <rich:column> <h:outputText value="Prénom" /> </rich:column> </rich:columnGroup> </f:facet> <rich:column> <h:outputText value="#{acteurs.nom}" /> </rich:column> <rich:column> <h:outputText value="#{acteurs.prenom}" /> </rich:column> </rich:dataTable> </form>
Le but est évidemment que le modal panel affiche le nom de la ligne doublecliquée et non celui par défaut ("D")
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 import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; public class ContexteUtilisateur { /** Liste des étudiants gérés par l'application. */ private List<Acteur> listeActeurs = null; /** Etudiant courant sélectionné. */ private Acteur acteurCourant; /** Liste des étudiants gérés par l'application. */ private List<Realisateur> listeRealisateurs = null; /** Etudiant courant sélectionné. */ private Realisateur realisateurCourant; /** Liste des étudiants gérés par l'application. */ private List<Video> listeVideos = null; /** Etudiant courant sélectionné. */ private Video videoCourant; public ContexteUtilisateur() { listeActeurs = new ArrayList<Acteur> (); listeRealisateurs = new ArrayList<Realisateur> (); listeVideos = new ArrayList<Video> (); listeActeurs.add(new Acteur("B","M")); listeActeurs.add(new Acteur("C","T")); listeActeurs.add(new Acteur("C","O")); listeRealisateurs.add(new Realisateur("S","S")); listeVideos.add(new Video("Le Mépris")); acteurCourant=new Acteur("D","F"); } public List<Acteur> getListeActeurs() { return listeActeurs; } public void selectionLigne() { System.out.println(acteurCourant); } public void setActeurCourant(Acteur act) { acteurCourant=new Acteur(act); } public Acteur getActeurCourant() { return acteurCourant; } }
le form doit être à l'interieur de la modalPanel, dans ton cas, vu qu'il y'a pas de submit dans la modalPanel, le form est inutile :
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 <rich:modalPanel id="modif" minHeight="200" minWidth="450" height="200" width="500" > <f:facet name="header"> <h:outputText value="Modifier les informations de l'acteur" /> </f:facet> <f:facet name="controls"> </f:facet> <h:form> <!-- si ya des inputs ou commandXXX--> <4j:outputPanel id="modalContent"> <h:outputText value="#{contexte.acteurCourant.nom}" /> </a4j:outputPanel> </h:form> </rich:modalPanel> <form> <rich:dataTable reRender="modif" onRowMouseOver="this.style.backgroundColor='#F1F1F1'" onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'" width="100%" var="acteurs" value="#{contexte.listeActeurs}"> <a4j:support reRender="modalContent" event="onRowDblClick" action="#{contexte.selectionLigne}" oncomplete="javascript:Richfaces.showModalPanel('modif')"> <f:setPropertyActionListener value="#{acteurs}" target="#{contexte.acteurCourant}"/> </a4j:support> <f:facet name="header"> <rich:columnGroup> <rich:column> <h:outputText value="Nom" /> </rich:column> <rich:column> <h:outputText value="Prénom" /> </rich:column> </rich:columnGroup> </f:facet> <rich:column> <h:outputText value="#{acteurs.nom}" /> </rich:column> <rich:column> <h:outputText value="#{acteurs.prenom}" /> </rich:column> </rich:dataTable> </form>
merci déjà pour cela.
rien sur mon problème de mise à jour de acteurCourant ?
pour l'instant le pop up ( c'est à dire le modal panel ) affiche le nom de acteurCourant par défaut ( "d" donc)
je voudrais que au double clic sur une ligne, l'acteur de la ligne considérée passe dans acteurCourant, et que le pop up s'affiche avec le changement convenable.
c'est le problème depuis le début le pop up il s'est toujours affiché c'est juste qu'il s'affiche avec la valeur par défaut de acteurCourant et pas celle attendue.
J'ai mis des points d'arrêt dans la fonction selectionLigne qui est appelée par l'attribut action et un autre dans le setActeurCourant : nadatu as essayé le code que je t'ai donné? ajoute un point d'arret sur l'action et regarde si la valeur de ton objet courant a bien été modifiée.
breakpoints ajoutés aussi dans le jsp et apparemment on ne passe jamais par l'attribut action.
le problème ne viendrait il pas des méthodes de mon bean dont j'ai donné le code ?
c'est bien ça que j'aimerais qu'on creuse XD pour l'instant action appelle (ou n'appelle pas malheureusement ^^' ) une fonction assez simple dont j'ai indiqué le code plus haut pour affecter les valeurs à acteurCourant. ( j'ai essayé d'y rajouter un setActeurCourant((Acteur)FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item")); sans succès )action="tu recupére ici les nouvelles valeurs et mettre à jour les propriétés lié au modalPanel"
tu avais dit que après l'ajout de h:form, l'action fonctionnait,
ajoute unvoir s'il n'y a pas d'erreurs de conversion/validation, si ça ne marche toujours pas, donne le code que tu teste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part <h:messages/>
le break point dans la jsp ne risque pas de marcher avec JSF, assure toi que tu es bien en mode debug, pour bien contrôler l'exécution de la requete JSF tu peux loguer les phases du cycle JSF, l'explication est dans la .
non ce qui marchait après l'ajout de form, c'était l'affichage du modal panel, avant effectivement ca bloquait mais l'acteur n'a jamais été mis à jour.
le plus simple serait peut être que vous testiez avec le code que j'ai donné pour vous faire une idée plus précise, il ne vous manque à la limite que la classe acteur qui ne comporte que les constructeurs getters et setters pour l'instant (pour nom et prenom )
je vais voir ce que me donne h:messages
edit : j'ai rajouté un h:messages juste après le datatable, ca ne donne rien
voilà, je remet le jsp et le contexte, j'ai du changer deux trois trucs en faisant des essais, et j'ajoute la classe utilisateur au cas où :
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <%@ taglib prefix="rich" uri="http://richfaces.org/rich"%> <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <link rel="stylesheet" type="text/css" href="styles.css"> <title>TBC's vidéo club</title> </head> <body> <f:view> <rich:tabPanel> <rich:tab label="Acteurs"> <rich:simpleTogglePanel id="toggleajout" switchType="server" label="Ajout d'un nouvel Acteur" height="90px"> <h:panelGrid columns="2"> <h:outputText value="Nom : " /> <rich:inplaceInput id="ajNom" value="#{contexte.nomNouveau}" defaultLabel="Cliquer pour entrer le nom de l'acteur"> </rich:inplaceInput> <h:outputText value="Prenom : " /> <rich:inplaceInput id="ajPrenom" value="#{contexte.prenomNouveau}" defaultLabel="Cliquer pour entrer le Prenom de l'acteur"> </rich:inplaceInput> </h:panelGrid> <form> <h:commandButton value="valider"> <a4j:support event="onClick" action="#{contexte.ajoutActeur}" reRender="toggleajout,tableActeurs"> </a4j:support> </h:commandButton> </form> </rich:simpleTogglePanel> <rich:modalPanel id="modif" minHeight="200" minWidth="450" height="200" width="500"> <f:facet name="header"> <h:outputText value="Modifier les informations de l'acteur" /> </f:facet> <f:facet name="controls"> </f:facet> <h:form> <!-- si ya des inputs ou commandXXX--> <a4j:outputPanel id="modalContent"> <h:outputText value="#{contexte.acteurCourant.nom}" /> </a4j:outputPanel> </h:form> </rich:modalPanel> <form><rich:dataTable id="tableActeurs" reRender="modif" onRowMouseOver="this.style.backgroundColor='#F1F1F1'" onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'" width="100%" var="acteurs" value="#{contexte.listeActeurs}"> <a4j:support reRender="modalContent" event="onRowDblClick" action="#{contexte.selectionLigne}" oncomplete="javascript:Richfaces.showModalPanel('modif')"> <f:setPropertyActionListener value="#{acteurs}" target="#{contexte.acteurCourant}" /> </a4j:support> <f:facet name="header"> <rich:columnGroup> <rich:column> <h:outputText value="Nom" /> </rich:column> <rich:column> <h:outputText value="Prénom" /> </rich:column> </rich:columnGroup> </f:facet> <rich:column> <h:outputText value="#{acteurs.nom}" /> </rich:column> <rich:column> <h:outputText value="#{acteurs.prenom}" /> </rich:column> </rich:dataTable></form> </rich:tab> <rich:tab label="Réalisateurs"> </rich:tab> <rich:tab label="Vidéos"> </rich:tab> </rich:tabPanel> </f:view> </body> </html>
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149 import java.util.ArrayList; import java.util.List; import javax.faces.context.FacesContext; import javax.faces.event.ActionEvent; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; public class ContexteUtilisateur { /** Liste des �tudiants g�r�s par l'application. */ private List<Acteur> listeActeurs = null; /** Etudiant courant s�lectionn�. */ private Acteur acteurCourant; /** Liste des �tudiants g�r�s par l'application. */ private List<Realisateur> listeRealisateurs = null; /** Etudiant courant s�lectionn�. */ private Realisateur realisateurCourant; /** Liste des �tudiants g�r�s par l'application. */ private List<Video> listeVideos = null; /** Etudiant courant s�lectionn�. */ private Video videoCourant; private String nomNouveau; private String prenomNouveau; public void setPrenomNouveau(String prenomNouveau){this.prenomNouveau = prenomNouveau;} public String getPrenomNouveau(){return prenomNouveau;} public void setNomNouveau(String nomNouveau){this.nomNouveau = nomNouveau;} public String getNomNouveau(){return nomNouveau;} public List<Acteur> getListeActeurs(){return listeActeurs;} public Acteur getActeurCourant(){return acteurCourant;} public void setActeurCourant(Acteur act){acteurCourant=new Acteur(act);} public ContexteUtilisateur() { listeActeurs = new ArrayList<Acteur> (); listeRealisateurs = new ArrayList<Realisateur> (); listeVideos = new ArrayList<Video> (); listeActeurs.add(new Acteur("B","M")); listeActeurs.add(new Acteur("C","T")); listeActeurs.add(new Acteur("C","O")); listeRealisateurs.add(new Realisateur("S","S")); listeVideos.add(new Video("Le Mépris")); acteurCourant=new Acteur("D","F"); nomNouveau="c"; prenomNouveau="p"; } public void selectionLigne() { setActeurCourant((Acteur)FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item")); System.out.println(acteurCourant); } public void selection (ActionEvent e) { setActeurCourant((Acteur)FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("item")); } public void ajoutActeur(ActionEvent e) { listeActeurs.add(new Acteur("nomNouveau","prenomNouveau")); } }
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 public class Personne { private String nom; private String prenom; public void setNom(String nom){this.nom = new String(nom);} public String getNom(){return nom;} public void setPrenom(String prenom){this.prenom = new String(prenom);} public String getPrenom(){return prenom;} public Personne(String nom, String prenom) { this.setNom(nom); this.setPrenom(prenom); } } public class Acteur extends Personne { public Acteur(String nom, String prenom) { super(nom,prenom); } public Acteur(Acteur act) { super(act.getNom(),act.getPrenom()); } public String toString() { return getNom()+getPrenom(); } }
là tu mélange deux méthodes pour récupérer la ligne courante de la dataTable, voilà quelques remarques:
1- utilise un seul form pour la page, qui entoure le tabPanel, le modalPanel, tu peux le mettre après, juste avant la fermeture de la balise f:view/
2- dans le setter tu crée une nouvelle instance de l'objet ..
3- l'action dans le a4j:suport n'est pas utile, tu peux t'en passer, la valeur est transmise par le setPropertyActionListener. Si tu veux utiliser l'action enlève la setPropertyActionListener et l'objet à récupérer de la requete correspond à la variable de la dataTable, dans ton cas (acteurs).
Code : Sélectionner tout - Visualiser dans une fenêtre à part public void setActeurCourant(Acteur act){this.acteurCourant= act;}
excellent ! ca marche !
merci, et avec tout ca je comprends un peu mieux comment fonctionnent ces échanges.
Bon je retire le tag résolu car en fait, si je remplace l'outputText par un inputText rien ne va plus ^^ message d'erreur "Target Unreachable".
J'imagine qu'il va chercher mes setters pour prévoir les changements mais ils y sont bien, donc je m'interroge sur la différence de traitement entre inputText et outputText
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager