Bonjour, je suis confronté à un problème d’utilisation du currentRow lors de la création dynamique d’une table.

Je souhaite créer une table dynamiquement, dont le nombre et les noms des colonnes ne sont pas connus à l’avance.

Pour cela, j’ai utilisé une classe faisant office de dataProvider mais qui ne s’appuie pas sur une autre classe dont les champs definissent les colonnes de la table, comme presenté dans de nombreux tutoriels.
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
 
public class vectordp extends ObjectArrayDataProvider{
 
    private Vector<String> nomcolumn = new Vector<String>();
    public Vector<String> getNomcolumn() {
        return nomcolum;
    }
 
    public void setNomcolumn(Vector<String> nomcolumn) {
        this.nomcolumn = nomolumn;
    }
 
    public vectordp() {
 
        Vector<String> v1 = new Vector<String>();    
        v1.add("18h23");
        v1.add("23h18");
        Vector<String> v2 = new Vector<String>();
        v2.add("18h23");
        v2.add("23h18");                
        Vector<String> v3 = new Vector<String>();
        v3.add("18h23");
        v3.add("23h18");
 
        Vector<Vector> ligne1 = new Vector<Vector>();
        ligne1.add(v1);
        ligne1.add(v2);
        ligne1.add(v3);
 
        nomcolumn.add("station1");
        nomcolumn.add("station2");        
        nomcolumn.add("station3");        
 
        this.setArray(linea1.toArray()); 
 
    }
Puis, en m’inspirant grandement d’une discussion precedente, sur la creation dynamique de tables (representant une table d’une base de données)

J’ai ecrit la creation dynamique de ma table de la maniere suivante :

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
   private vectordp vecdp = new vectordp();
   private Table createTable() {
 
        Table table = new Table();
 
        table.setId("table1");
        table.setTitle("Dynamically Created Table");
        table.setPaginateButton(true);
        table.setPaginationControls(true);
 
        // Create the Table Row group dynamically
 
        TableRowGroup rowGroup = new TableRowGroup();
        rowGroup.setId("rowGroup1");
        rowGroup.setSourceVar("currentRow");
        rowGroup.setSourceData(vecdp);
        ValueExpression valueexp;
        int nbColumn=getVecdp().getNombrescolumnas().size();
 
        for (int i = 0; i < nbColumn; i++) {
            // Create all columns
            TableColumn tableColumn = new TableColumn();
            tableColumn.setId("tableCol"+String.valueOf(i+1));
            tableColumn.setSort(getVecdp().getNomcolumn().get(i));
            tableColumn.setHeaderText(getVecdp().getNomcolumn().get(i));
 
            rowGroup.getChildren().add(tableColumn);
 
            StaticText staticText = new StaticText();
            valueexp=expressionFactory.createValueExpression(elContext,"#{currentRow.value['"+getVecdp().getNomscolumn().get(i)+"']}",String.class);
            staticText.setValueExpression("text",valueexp);        
            staticText.setId("textstatic"+String.valueOf(i+1));
            tableColumn.getChildren().add(staticText);
        }
        table.getChildren().add(rowGroup);
        return table;
    }
 
        Table dynamicTable =  createTable();
        layoutPanel1.getChildren().add(dynamicTable);

A l’execution, j’ai eu l’erreur suivante :

Caused by: java.lang.IllegalArgumentException: station1
at com.sun.data.provider.impl.ObjectListDataProvider.getFieldKey(ObjectListDataProvider.java:463)
at com.sun.data.provider.impl.TableRowDataProvider.getFieldKey(TableRowDataProvider.java:113)
at com.sun.webui.jsf.faces.DataProviderELResolver$ValueData.getValue(DataProviderELResolver.java:387)
... 65 more


Je pense avoir compris que l’execution plante lors de la manipulation de l’objet currentRow, car il cherche dans cet objet, un champ dont la clé soit station1, or je n’ai pas fait l’association entre mon vecteur v1 (dans le vecteur ligne du vectordp) et le nom “station1” (present lui dans le vecteur nomcolumn du vectordp).
Il semble que cette association se fasse “naturellement” lors de la creation statique d’une table avec un dataprovider qui rend un tableau de type MaclasseDefinissantMesColonnes[numlignes] montableau;….. return montableau;


Quelqu’un pourrait-il m’indiquer comment faire cette association (clé-valeur) ?

(Je crois qu’il existe un type de données définissant des tableaux de (clé-valeur) , qui serait alors plus adapté que mes Vector … si vous voyez de quoi je veux parler, pouvez-vous m’eclairer sur le sujet??)

Merci d'avance.