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

Eclipse Platform Discussion :

Remplir les colonnes dans un TableViewer dynamiquement


Sujet :

Eclipse Platform

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Points : 85
    Points
    85
    Par défaut Remplir les colonnes dans un TableViewer dynamiquement
    Bonjour,

    j'ai quelques difficultés à remplir un TableViewer dynamiquement.

    J'ai donc une TableViewer avec plusieurs colonne, chacune correspondant à un attribut des objets que je veux afficher.

    J'ai implémenter IStructuredContentProvider et LabelProvider mais tout ce que j'arrive a faire c'est d'afficher dans la premier colonne, getText ne renvoyant qu'une String pour mon objet.

    Je suppose que c'est dans LabelProvider qu'il faut que j'arrange la chose..?
    J'ai essayé une astuce pour le remplir mais vu que je returne null il m'affiche deslignes vide au debut du tableau.

    Voici mon code :

    public class TableContentProvider implements IStructuredContentProvider{

    public Object[] getElements(Object inputElement) {
    // TODO Auto-generated method stub
    return ((List)inputElement).toArray();
    }

    public void dispose() {
    // TODO Auto-generated method stub
    }
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    // TODO Auto-generated method stub

    }
    }

    public class TableLabelProvider extends LabelProvider {
    public String getText(Object element) {
    Lot p = (Lot) element;
    Table tab = table.getTable();
    TableItem tl1 = new TableItem(tab,SWT.LEFT);
    tl1.setText(0,p.getNumLot().toString());
    tl1.setText(1,p.getDescLot());
    tl1.setText(2,p.getEstimMin().toString());
    tl1.setText(3,p.getEstimMax().toString());
    return null; // au depart je retourner juste une chaine mais je n'avais les infos que sur une colonne
    }
    }

    Alors soit je ne m'y prend pas du tout comme il faut, soit il y a une astuce que je n'ai pas vu...

    D'autre part, contrairement a quand j'ajoute une simple Table, la je n'ai rien par defaut pour la selection. Si je click sur ma table ça ne fait rien.
    Comment puis-je remedier a cela ?


    Merci de votre aide.

  2. #2
    Membre régulier Avatar de Mucho
    Inscrit en
    Décembre 2005
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 221
    Points : 109
    Points
    109
    Par défaut
    Utilise ITableLabelProvider
    et ajoute un SelectionListener

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Points : 85
    Points
    85
    Par défaut
    Merci.

    J'ai donc ecrit un truc comme ça :

    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
     
    public class TableLabelProvider implements ITableLabelProvider {
     
    	public String getColumnText(Object element, int columnIndex) {
     
    		Lot p = (Lot) element;
    		String str = null;
    		switch (columnIndex)
    		{
    			case 0: str = p.getNumLot().toString();break;
    			case 1: str = p.getNomLot();break;
    			case 2: str = p.getDescLot();break;
    			case 3: str = p.getEstimMin()+"-"+p.getEstimMax();break;				
    		}
    		return str;
    	}
             ...(les autres méthodes)
    }
    avec ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    tab.setContentProvider(new TableContentProvider());
    tab.setLabelProvider(new TableLabelProvider());		
    tab.setInput(listeLots);
    tab etant mon TableViewer.

    Mais rien ne ce passe
    Qu'est-ce que je fait mal ?

    Petite question au passage, pour le moment j'essai de remplir ce tableau en static, mais par la suite cela devra etre dynamiquement.
    Je pensais ajouter une méthode a ma Vue, du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public majInfos(List liste) {
         tab.setContentProvider(new TableContentProvider());
         tab.setLabelProvider(new TableLabelProvider());		
         tab.setInput(listeLots);
    }
    Est-ce une fausse bonne idée ?

    Merci de votre aide.

  4. #4
    Membre régulier Avatar de Mucho
    Inscrit en
    Décembre 2005
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 221
    Points : 109
    Points
    109
    Par défaut
    Mais rien ne ce passe
    Qu'est-ce que je fait mal ?
    Quand tu fais setInput(unTruc);
    alors unTruc est passé en paramètre à la méthode getElements de ton content provider

    (tu peux vérifier : 1° que ca marche / 2° que listeLots n'est pas vide)

    getELements renvoi une liste de machins
    pour chaque machin (et aussi pour chaque colonne):
    getColumnText est appelée avec en paramètre le machin et le numéro de la colonne

    (tu peux vérifier : 1° que ca marche / 2° que la valeur renvoyé n'est pas vide)



    Je pensais ajouter une méthode a ma Vue, du style :
    Code :

    public majInfos(List liste) { tab.setContentProvider(new TableContentProvider()); tab.setLabelProvider(new TableLabelProvider()); tab.setInput(listeLots); }

    Est-ce une fausse bonne idée ?
    Je pense que ça dépend de la "quantité" de la mise à jour :
    - si c'est pour tout changer c'est OK
    - si c'est pour ajouter une ou des items à la liste => add c'est mieux
    - si c'est pour rafraichir les valeurs => refresh
    ...

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par Mucho
    Quand tu fais setInput(unTruc);
    alors unTruc est passé en paramètre à la méthode getElements de ton content provider

    (tu peux vérifier : 1° que ca marche / 2° que listeLots n'est pas vide)

    getELements renvoi une liste de machins
    pour chaque machin (et aussi pour chaque colonne):
    getColumnText est appelée avec en paramètre le machin et le numéro de la colonne

    (tu peux vérifier : 1° que ca marche / 2° que la valeur renvoyé n'est pas vide)
    C'est bien ce que j'avais compris, c'est deja ça!

    Ma liste n'est pas vide, ça c'est sur puisque je la rempli pour le moment a la main juste avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List listeLots = new ArrayList();		
    listeLots.add(new Lot(...));
    listeLots.add(new Lot(...));
    listeLots.add(new Lot(...));
     
    tab.setContentProvider(new TableContentProvider());
    tab.setLabelProvider(new TableLabelProvider());		
    tab.setInput(listeLots);
    Pour mon TableContentProvider je refait la meme chose que ma premiere version qui marchait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class TableContentProvider implements IStructuredContentProvider{
    	public Object[] getElements(Object inputElement) {
    		return ((List)inputElement).toArray();
    	}
    }
    Donc j'obtient bien une tableau d'objet, et la methode getColumnText est ensuite appelé pour chacun de ses objet et pour chaque colonne...

    Mais ça veut pas
    Je viens de voir que j'ai ces messages dans VE :


    normal ou pas ? :s

    Et pour la question sur le majInfo : oui c'est pour changer completement ma table.
    En faite je veux que quand je selectionne un element dans un tableau d'une autre vue, celui la se remplisse en fonction de cet element.

    Merci.

  6. #6
    Membre régulier Avatar de Mucho
    Inscrit en
    Décembre 2005
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 221
    Points : 109
    Points
    109
    Par défaut
    Dans getColumnText tu as vérifié que pour "return str;" str n'est pas vide ?

    et sinon si tu as une table vide affichée, je ne comprend pas pourquoi elle n'est pas remplie :/

  7. #7
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Points : 85
    Points
    85
    Par défaut
    Le truc bizarre aussi c'est que je n'ai qu'un carré blanc en guise de table, je n'ai meme pas les nom de colonnes...?

    Le problème viendrait peut-etre de la ?
    (voir image post precedent)

  8. #8
    Membre régulier Avatar de Mucho
    Inscrit en
    Décembre 2005
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 221
    Points : 109
    Points
    109
    Par défaut
    effectivement, je ne sais pas si le VE affiche bien les tables mais si à l'éxecution tu ne voit pas les colonnes alors ça ne vient pas des providers mais de la creation de ta Table

  9. #9
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Points : 85
    Points
    85
    Par défaut
    Re-moi!

    Bon, j'ai tout refait ma Vue et surtout relancer Eclipse car en faite VE plantait.

    ça marche!

    Par contre mon tableau de s'affiche que sur une seul ligne, et je suis obligé d'utilisé la scrollbar pour voir les autres éléments.

    Il y a un truc pour afficher un nombre de ligne max(ou moins que le max mais en fonction du nombre d'élément)?
    Ou bien peut-etre juste raffraichir la vue ? (je ne sais pas faire)


    Enfin, pour terminé avec mes probleme de Tableau, je voudrait ajouter un sorter pour fire des tris selon les champs de mes colonnes, mais je ne sais pas trop comment proceder et je ne trouve pas d'exemple sur internet.

    bien sur je sais qu'il faut utiliser "setSorter(ViewSorter sorter)" pour l'ajouter a mon TableViewer mais je ne comprend pas comment coder un ViewSorter (ou s'il y en a un specifique a utiliser ? du genre tableSorter) ?

    Merci!!

  10. #10
    Membre régulier Avatar de Mucho
    Inscrit en
    Décembre 2005
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 221
    Points : 109
    Points
    109

  11. #11
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Points : 85
    Points
    85
    Par défaut
    Merci du lien

    J'ai essayé de faire ça pour chaque colonne de ma table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    TableColumn tc1 = new TableColumn(table,SWT.LEFT);
    tc1.setText("N° Lot");
    tc1.setWidth(75);
    tc1.addSelectionListener(new SelectionAdapter() {
     
            public void widgetSelected(SelectionEvent e) {
    	      tableV.setSorter( new TableSorter(TableSorter.NUM));
    	}
    });
    Et pour mon TableSorter j'ai fait ça :

    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
     
    public class TableSorter extends ViewerSorter {
    	public static final String NUM="NUM";
    	public static final String NOM="NOM";
    	public static final String DES="DES";
    	public static final String CAT="CAT";
    	public static final String EST="EST";
     
    	private String param = null;
     
            //constructeur	
    	public TableSorter(String p) {
                            super();
    			this.param=p;
    	}
    	public int compare(Object o1, Object o2){
    		int comp=0;
    		if(param=="NUM")
    		{
    			Integer i1,i2;
    			i1 = (Integer)o1;
    			i2 = (Integer)o2;
    			comp =i1.compareTo(i2); 
    		}
    		if(param=="NOM" || param=="DES" || param=="CAT" ||param=="EST")
    		{
    			String s1,s2;
    			s1=(String)o1;
    			s2=(String)o2;
    			comp =s1.compareTo(s2); 
    		}
    		if(comp<0)
    			return -1;
    		if(comp>0)
    			return 1;
    		if(comp==0)
    			return 0;						
    		return 0;
    		}
    	}
    Il n'y a que cette méthode a surcharger non ?
    Je pense qu'elle fait ce qu'il faut ?

    En tout ca sle résultat n'est pas la

    Pour le NUM, j'obtient le classement : 1,3,2
    Pour tout ce qui est chaine je n'ai aucun résultat...

    Edit : en faite si, mais avec le meme probleme que pour les Integer.
    Et une fois que j'ai cliqué sur une colonne, impossible d'effectué un autre tri (plus rien ne bouge)

    Enfin, je me souvient l'avoir vu quelque part mais je n'arrive plus a le retrouver, il y a un truc pour choisir l'ordre de tri ? (decroissant/croissant) ?
    Et que ça change quand on reclick sur la colonne



    Sinon je n'arrive toujours pas a afficher plus d'une ligne dans mon tableau.... :'(


    Merci

  12. #12
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par gargantua

    Sinon je n'arrive toujours pas a afficher plus d'une ligne dans mon tableau (Table + TableViewer).... :'(


    Merci

    Personne ?

    merci

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 145
    Points : 179
    Points
    179
    Par défaut
    Il faut regarder au niveau du LayoutManager.
    Ta table a certainement besoin d'un setLayoutData approprié.
    Understanding layouts in SWT

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut [Résolu]
    Bonjour à tous,

    Après avoir aussi un peu galèré avec ce problème étrange : uniquement la première colonne qui se peuple, voici -enfin- la solution!
    Il faut tout d'abord créer un objet Table , puis un table viewer:

    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
     
    Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION);
    table.setLinesVisible(true);
    table.setHeaderVisible(true);
     
    TableLayout layout = new TableLayout();
    layout.addColumnData(new ColumnWeightData(1, 200, true));
    ...
    table.setLayout(layout);
     
    TableColumn nameColumn = new TableColumn(table, SWT.NONE);
    nameColumn.setText("Subject");
    ...
     
    TableViewer viewer = new TableViewer(table);
    viewer.setContentProvider(new ViewContentProvider());
    viewer.setLabelProvider(new ViewLabelProvider());
    viewer.setSorter(new NameSorter());
    viewer.setInput(getViewSite());
    et voilà!

Discussions similaires

  1. [FPDF] problème avec les images dans un tableau dynamique
    Par GADSN dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 08/04/2009, 11h11
  2. Remplir les colonnes avec Vista
    Par Yepazix dans le forum Windows Vista
    Réponses: 18
    Dernier message: 23/05/2007, 02h13
  3. Remplir les colonnes d'un fichier excel
    Par craryb dans le forum MFC
    Réponses: 3
    Dernier message: 14/03/2007, 12h37
  4. Intervertir les colonnes dans un MSFlexGrid
    Par kooki dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 26/07/2006, 17h49
  5. Réponses: 5
    Dernier message: 25/07/2005, 14h03

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