Affichage d'une liste avec Grid

Bonjour,

Je suis nouveau sous Vaadin et j’aimerais avoir un peu d’aide pour un problème. Donc mon application récupère un fichier et stocke ses données sous forme de liste (avec la fonction ArrayList) et j’aimerais les afficher dans un tableau. J’ai regardé comment marche la fonction Grid, mais sous les tuto on ne peut qu’afficher les données qui sont à l’intérieur d’une classe. Je ne peux pas créer de classe avec des getter et setter, car je ne connais pas le nombre d’éléments à afficher au préalable. Pourriez-vous m’indique la méthode ou une autre fonction qui permet d’afficher mes éléments.

Merci

Bonjour,

Je ne comprends pas exactement ta question.
Tu récupères un fichier, tu le transformes en List<?> (liste de quel type, une Map, un bean ? ). C’est bien ça ?

Après il faut définir ta grille les colonnes que tu veux afficher puis faire un setItems de cette liste.
Grid<?> myGrid = new Grid();
myGrid.addColumn(…)

grid.setItems(myImportedList);

Est-ce que tu as un exemple de ta liste ?

J’aimerais faire quelque chose comme ça:
ArrayList<ArrayList> importFile = …;
ArrayList col1 = …;
ArrayList col2 = …;

importFile.add(col1);
importFile.add(col2);

Grid<ArrayList> myGrid = new Grid<>();
myGrid.setItems(importFile);
myGrid.addColumn(importFile.get(0)).setCaption("col1");
myGrid.addColumn(importFile.get(1)).setCaption("col2");
...

Normalement ceci fonctionne.

Fais bien attention aux déclarations:

    private List<List<?>>  importFile = new ArrayList<>();
    private Grid<List<?>> myGrid = new Grid<>();

Si tu mets ceci:

    private List<List<?>>  importFile = new ArrayList<>();
    private Grid<List> myGrid = new Grid<>();

Ca ne marche plus (à cause du setItems).

   
    private List<List<?>>  importFile = new ArrayList<>();
    private Grid<List<?>> myGrid = new Grid<>();

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        importFile.add(Arrays.asList("DATA line 1 col 1 ","Data line 1 col 2",1));
        importFile.add(Arrays.asList("DATA line 2 col 1 ","Data line 2 col 2",1));
        importFile.add(Arrays.asList("DATA line 3 col 1 ","Data line 3 col 2",1));

        myGrid.setItems(importFile);
    //    myGrid.setDataProvider(DataProvider.ofCollection(importFile)); // autre solution au lieu de setItems
        myGrid.addColumn(line -> line.get(0)).setCaption("Col 1");
        myGrid.addColumn(line -> line.get(1)).setCaption("Col 2");
        myGrid.addColumn(line -> line.get(2)).setCaption("Col 3");
        setContent(myGrid);
    }

J’ai réussi à afficher un tableau, mais j’ai encore deux problèmes.
Voici comment je récupère les valeurs stocké dans mon fichier:

while(iterarator.hasNext()){
	line = iterartor.next();
	
	for(int i = 0; i < line.size; i++){
		column.add(line.get(i));
	}
	
	importFile.add(Arrays.asList(column.toCharArray()));
}

Mais cela m’affiche chaque colonne sur 1 ligne.

Mon deuxième problème est quand j’ai essayé d’ajouter mes colonnes via une boucle:

		List<List<?>> importFile = openFile.getLines();
        this.Displaylines.setItems(importFile);
        
        for (int i = 0; i < importFile.size(); i++) {
            this.Displaylines.addColumn(line -> line.get(i)).setCaption("Colonne " + i);                
        }

J’ai cette erreur qui s’affiche: local variables referenced from a lambda expression must be final or effectively final

Essaie ceci:
myGrid.setDataProvider(DataProvider.ofCollection(importFile));
au lieu de myGrid.setItems

Le deuxième code est faux: Tu itères sur tes lignes (l’indice i est un indice de ligne) et ensuite tu utilises cet indice pour afficher une colonne.


    private List<List<?>>  importFile = new ArrayList<>();
    private Grid<List<?>> myGrid = new Grid<>();

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        importFile.add(Arrays.asList("DATA line 1 col 1 ","Data line 1 col 2",1));
        importFile.add(Arrays.asList("DATA line 2 col 1 ","Data line 2 col 2",1));
        importFile.add(Arrays.asList("DATA line 3 col 1 ","Data line 3 col 2",1));
        importFile.add(Arrays.asList("DATA line 4 col 1 ","Data line 4 col 2",1));

      //  myGrid.setItems(importFile);
        myGrid.setDataProvider(DataProvider.ofCollection(importFile));
        if (importFile != null && importFile.size() > 0){
            List<?> firstLine = importFile.get(0);
            for (int columnIndex = 0; columnIndex < firstLine.size(); columnIndex++) {
                final int finalColumnIndex = columnIndex;
                myGrid.addColumn(line -> line.get(finalColumnIndex)).setCaption("Colonne " + finalColumnIndex);
            }
        }

        setContent(myGrid);
    }

Effectivement c’était bien la méthode setItems le problème, j’ai essayé avec la méthode setDataProvider est ça marche.
Merci