Bonjour,

Alors voila, je suis entrain de creer une page de gestion de groupe en JSF.
Pour cela, l'utilisateur doit etre capable de creer une datatable par groupe. Enfin, il doit etre capable d'ajouter une entree dans ces datatable quand il veut ajouter une personne dans un groupe.

La creation de table dynamique ne pose pas de soucis particulier. Ma page jsf contien un h:panelGrid bindé à un objet dans le backing bean ou se trouve également ma fonction de création de table.
Chacune des tables creer doit posseder sa propre instance de ManagedBean dont je me sers pour faire l'interface entre IHM et BDD. Ces managed bean sont donc creer en même temps que les datatables, stockés dans une liste, et bindés a la datatable. Rien de bien sorcier.

Hop, fonction de creation de table:

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
 
public void ajouterGroupe(){
        //Panel qui contiendra l'ensemble des composants à ajouter pour creer un nouveau groupe de rotation
        HtmlPanelGrid panel = new HtmlPanelGrid();
        //Parametrage du panel
        panel.setId("panelSemaineTypeGroupe"+panelGroupesSemaineType.getChildCount());
        panel.setStyle("width:100%;");
 
 
        //Nouvelle table contenant les horaires types
        HtmlDataTable table = new HtmlDataTable();
        table.setId("tableSemaineTypeGroupe"+panelGroupesSemaineType.getChildCount()); //identification de la nouvelle table
        table.setBorder(1); //style de la nouvelle table
        SemaineTypeManagedBean mb = new SemaineTypeManagedBean(panelGroupesSemaineType.getChildCount());
        mb.setBackingSemaineType(this); //Lien
        mb.setSemainesTypesDAO(semainesTypesDAO);
        semaineTypeManagedBeans.add(mb);
        table.setValue(semaineTypeManagedBeans.get(panelGroupesSemaineType.getChildCount()).getModel().getWrappedData());
        table.setVar("ligne");
        table.setColumnClasses("td");
        table.setHeaderClass("th");
        table.setRowClasses("list-row-even td, list-row-odd td");
        table.setStyleClass("tableau");
        table.setStyle("left:20%;width:60%;");
        listeTable.add(table);
 
        //Colonne des totaux
        UIColumn totaux = new UIColumn();
        totaux.setId("totauxGroupe"+panelGroupesSemaineType.getChildCount());
        HtmlOutputText headerTotaux = new HtmlOutputText();
        headerTotaux.setId("totalGroupeHeader"+panelGroupesSemaineType.getChildCount());
        headerTotaux.setValue("Total");
        totaux.setHeader(headerTotaux);
        //Texte de la colonne des Totaux
        HtmlOutputText total = new HtmlOutputText();
        total.setId("totalGroupe"+panelGroupesSemaineType.getChildCount());
        //total.setValueExpression("",ExpressionFactory.newInstance().createValueExpression(FacesContext.getCurrentInstance().getELContext(),"#{ligne.total}",Integer.class));
        total.setValue("bbb");
        //Ajout du texte dans la colonne
        totaux.getChildren().add(total);
 
        //Ajout des colonnes à la table
        table.getChildren().add(totaux);
 
        //Bouton d'ajout de ligne
        Button ajoutLigne = new Button();
        ajoutLigne.setId("ajoutTech"+panelGroupesSemaineType.getChildCount());
        ajoutLigne.setImageURL("/resources/img/ajouter.jpg");
        ajoutLigne.setToolTip("Ajouter un technicien");
        Class[] parametreAction = new Class[] {ActionEvent.class};
        ajoutLigne.setActionListenerExpression(ExpressionFactory.newInstance().createMethodExpression(FacesContext.getCurrentInstance().getELContext(),"#{SemaineType.ajouterCode}",null,parametreAction));
 
 
        //Panel de sepraration pour eviter que les tables représentant les groupes ne soient collées les unes aux autres
        HtmlPanelGrid panelSeparation = new HtmlPanelGrid();
        panelSeparation.setId("panelSeparationSemaineTypeGroupe"+panelGroupesSemaineType.getChildCount());
        panelSeparation.setStyle("width:15px;");
 
        // Ajout de la datatable au panel principal
        panel.getChildren().add(table);
        // Ajout du bouton d'ajout de ligne
        panel.getChildren().add(ajoutLigne);
        // Ajout du panel de séparation au panel principal
        panel.getChildren().add(panelSeparation);
 
        // Ajout du panel créer dans la page
        panelGroupesSemaineType.getChildren().add(panel);
    }
Comme vous pouvez le voir, je crée egalement un bouton en même temps que ma table qui permet d'ajouter une ligne dans ma table grace a cette fonction :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
    public void ajouterCode(ActionEvent ae){
        String buttonId = ((Button)ae.getSource()).getId();
        DataModel temp = (DataModel) (this.semaineTypeManagedBeans.get(Integer.valueOf(buttonId.substring(9)))).getModel();
        ((List)temp.getWrappedData()).add(new SemaineTypeIHM());
        this.listeTable.get(Integer.valueOf(buttonId.substring(9))).setValue(temp);
(Cette version est plus compliqué que nécessaire, je sais, mais je m'en suis servie pour le debuggage et etre sur que les lignes etaient bien ajoutée correctement dans les données)
Je recupere l'id du bouton pour trimmer le numero de groupe que j'ai rajouter a la fin de son ID pour identifier la table a laquelle je dois rajouter une ligne.

Voila, je sais, parceque je l'ai deja fait dans une table normale, ecrite dès le depart dans la jsp, que d'ajouter un objet du type à afficher à la liste alimentant le datamodel bindé a la datatable permet d'ajouter une ligne vide au niveau graphique.

Pourtant, ce n'est pas le cas ici.
Mes fonctions sont bien appelées quand elles le doivent. Et donc, avec le debugger, je vois bien que les nouvelles instance d'objet sont bien créées et ajoutées à ma liste qui alimente ma datatable. Pourtant, absolument aucune nouvelle ligne n'est affichée. Et je n'arrive vraiment pas a voir pourquoi.

Est-ce-que vous pourriez me dire ce qui pourrait causer un tel problème, s'il vous plait ? Parceque la, je seche, et ca me bloque completement pour l'avancement de mon projet.

Merci,

Yann