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

Composants Java Discussion :

Jtable créée avec model et filtre, probleme de tri


Sujet :

Composants Java

  1. #1
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut Jtable créée avec model et filtre, probleme de tri
    bonjour à tous

    J'espère être dans la bonne catégorie de message

    me voila en stage et je travaille sur le debeugage d'une application java - hibernate - xml
    et la je coince, je vais donc essayer d'être claire

    J'ai une Jtable dans une Jdialog que l'on ouvre de la fenetre principale (peut être aucune importance). La JTable se rempli apres avoir cliquer sur un bouton (qui appartient à la JDialog)
    On peut eventuellement filtrer les données à afficher
    On peut cliquer sur l'entete d'une colonne pour trier les données affichées.
    ensuite le double clique ouvre la ligne selectionnée dans la fenetre principale

    Mon problème est que si l'on fait un tri sur une colonne (que les lignes ont changé de place) le double clic ouvre la ligne qu'il y a initialement à cette place.

    Un exemple ce sont des vols que l'on tri avec num de vol, date, compagnie (y a plus de données mais ça serait plus compliqué) prenons les données suivantes
    1 - A1234 23/05/06 Finnair
    2 - A1232 24/05/06 Scandinaves
    3 - A1236 27/04/06 Japan
    Si je fais un tri sur le num de vol j'aurais les lignes dans cet ordre : 2 1 puis 3
    mais si je selectionne la 1ere ligne qui contient à l'écran les données du vol A1232 il m'ouvre le vol A1234...
    C'est à peu pres clair ?

    J'ai l'impression que c'est à cause du filtre du coup il filtre pas les données originales. et comme il recupère les données à partir de la liste originale ça beug.
    Donc mes questions sont :
    - Est ce que le filtre sert aussi à filtre les données via des critères (genre que les vols de finnair) ? au quel cas je ne peux pas le retirer
    - Est ce qu'on peut propager le tri à la liste originale ?

    Merci beaucoup
    A+

  2. #2
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Je pense que ton problème vient du fait qu'il n'y que l'index d'affichage qui change et pas celui du modèle, ce qui est normal, il te faut donc convertir l'index d'affichage en celui du modèle.

    Il faudrait savoir ce que tu emploies pour trier, car normalement il devrait contenir une méthode du style convertRowIndexToModel ou convertRowModelToIndex (ce sont les méthodes avec la JXTable).

  3. #3
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    coucou

    En effet ils ne servent pas des méthodes que tu cites. Le code est assez long mais les fonctions qui font le tri doivent être celles la :

    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
     
        protected TableModel tableModel;
        private Row[] viewToModel;
        private int[] modelToView;
     
        private Row[] getViewToModel() {
            if (viewToModel == null) {
                int tableModelRowCount = tableModel.getRowCount();
                viewToModel = new Row[tableModelRowCount];
                for (int row = 0; row < tableModelRowCount; row++) {
                    viewToModel[row] = new Row(row);
                }
     
                if (isSorting()) {
                    Arrays.sort(viewToModel);
                }
            }
            return viewToModel;
        }
     
      public int modelIndex(int viewIndex) {
            return getViewToModel()[viewIndex].modelIndex;
        }
     
        private int[] getModelToView() {
            if (modelToView == null) {
                int n = getViewToModel().length;
                modelToView = new int[n];
                for (int i = 0; i < n; i++) {
                    modelToView[modelIndex(i)] = i;
                }
            }
            return modelToView;
        }
     
     
        private class TableModelHandler implements TableModelListener {
            public void tableChanged(TableModelEvent e) {
                // If we're not sorting by anything, just pass the event along.
                if (!isSorting()) {
                    clearSortingState();
                    fireTableChanged(e);
                    return;
                }
     
                // If the table structure has changed, cancel the sorting; the
                // sorting columns may have been either moved or deleted from
                // the model.
                if (e.getFirstRow() == TableModelEvent.HEADER_ROW) {
                    cancelSorting();
                    fireTableChanged(e);
                    return;
                }
                int column = e.getColumn();
                if (e.getFirstRow() == e.getLastRow()
                        && column != TableModelEvent.ALL_COLUMNS
                        && getSortingStatus(column) == NOT_SORTED
                        && modelToView != null) {
                    int viewIndex = getModelToView()[e.getFirstRow()];
                    fireTableChanged(new TableModelEvent(TableSorter.this,
                            viewIndex, viewIndex, column, e.getType()));
                    return;
                }
     
                // Something has happened to the data that may have invalidated the
                // row order.
                clearSortingState();
                fireTableDataChanged();
                return;
            }
        }
    J'espère que ce morceaux de code pourra vous éclairer parce que moi j'ai beau allé voir les tuto je suis dans le noir

    Merci
    a+

  4. #4
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    Re, je ne trouve pas dans la doc en ligne de java la JXTable Est ce une erreur de frappe ?
    Les methodes convertRowIndexToModel ou convertRowModelToIndex ne sont pas non plus données. Je trouve convertRowIndexToModel pour la classe RowSorter. Est ce que tu peux m'éclairer ?
    Merchi

  5. #5
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    C'est encore moi
    Je pense que j'ai trouvé la méthode dont tu me parlais : convertColumnIndexToModel et ils l'utilisent dans cette class (qui est dans el meme fichier que le reste du code affiché )

    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
     
        private class SortableHeaderRenderer implements TableCellRenderer {
            private TableCellRenderer tableCellRenderer;
     
            public SortableHeaderRenderer(TableCellRenderer tableCellRenderer) {
                this.tableCellRenderer = tableCellRenderer;
            }
     
            public Component getTableCellRendererComponent(JTable table,
                    Object value, boolean isSelected, boolean hasFocus, int row,
                    int column) {
                Component c = tableCellRenderer.getTableCellRendererComponent(
                        table, value, isSelected, hasFocus, row, column);
                if (c instanceof JLabel) {
                    JLabel l = (JLabel) c;
                    l.setHorizontalTextPosition(JLabel.LEFT);
                    int modelColumn = table.convertColumnIndexToModel(column);
                    l.setIcon(getHeaderRendererIcon(modelColumn, l.getFont()
                            .getSize()));
                }
                return c;
            }
        }

  6. #6
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Citation Envoyé par pequina
    Re, je ne trouve pas dans la doc en ligne de java la JXTable Est ce une erreur de frappe ?
    Les methodes convertRowIndexToModel ou convertRowModelToIndex ne sont pas non plus données. Je trouve convertRowIndexToModel pour la classe RowSorter. Est ce que tu peux m'éclairer ?
    Merchi
    La JXTable est une classe du projet SwingX dont tu ne vas pas la trouver dans la doc de l'api standard.

    Dans ta classe, ca doit être la méthode modelIndex qu'il faut employer.

  7. #7
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    Ben ils s'en servent de cette méthodes et ils y font appel (cf. première partie de code donnée)
    Grrr je susi sur que l'erreur est devant moi mais j'arrive pas à saisir.

  8. #8
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    Coucou
    Tjrs moi

    Bon après moulte tests je m'appercois qu'en fait c'est quand je veux valider ma selection (double clic sur la ligne ou selection + bouton ok), ca fait ce qu'il ne devrait pas faire. Alors je sais pas trop ce qu'il fait mais j'ai l'impression qu'il efface l'index de correspondance (entre vue et modele) et qu'il le met à neuf donc il perd le classement. Pb c'est qu'on demande rien dans l'appli pour qu'il le "nettoye".
    Si qqn a une idée faites moi signe
    Merci bcp
    A+

  9. #9
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Qu'est ce qui est fait quand tu "valides" une ligne? (ptit bout de code)

  10. #10
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    alors ca c'est pour le double click je doute qu'il y est un pb ici mais bon sait on jamais ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public void mouseClicked(MouseEvent e) {
     
            if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
     
                getAction()
                        .actionPerformed(new ActionEvent(e.getSource(), 0, null));
            }
        }
    ensuite ca c'est dans l'initialisation de la fenetre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            JTable table = getTable();
     
     
            JTableHeader tableHeader = table.getTableHeader();
     
            TableSorter tableSorter = new TableSorter(getTableModel());
            tableSorter.setTableHeader(tableHeader);
            table.setModel(tableSorter);
     
            table.addMouseListener(new EffSelectionTableMouseListener(
                    getValidateOpenEffAction()));
     
            table.setSelectionModel(getSelectionModel());
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        private JTable getTable() {
            if (this.table == null) {
                this.table = new JTable();
                this.table.getTableHeader().setReorderingAllowed(false);
                this.table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),"none" );
                this.table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE,0),"none" );
            }
            return this.table;
        }
     
        public Action getValidateOpenEffAction() {
            return this.validateOpenEffAction;
        }
    apres c'est "mappé" avec xml
    Je sais pas ce qui est "necessaire", je galere un peu à m'y retrouver moi meme. dis moi si c'est assez
    Merci

  11. #11
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Quelle méthode est appelée lorsque tu rentre là-dedans lors du double-clic?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    getAction().actionPerformed(new ActionEvent(e.getSource(), 0, null));
    Tu fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0),"none" );
    Mais n'y a-t-il pas un endroit où gère l'appui sur la touche "Entrée" de manière à valider ta sélection?

  12. #12
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    ben en fait l'action ne fait que fermer la fenetre (enfin la cache)

    pour la touche entrée si mais c l'autre la jdialog qui le traite mais c'est pareil que pour le actionPerformed il rend la fenetre invisble.

    Si j'ai suivi ce qu'on m'a expliqué c'est swing qui par le biais des ecouteur qui recupere ce qu'il faut.

    le truc que je comprends pas c'est la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public Collection getEffs() {
            JDialog dialog = getDialog();
     
            // Show the dialog
            dialog.show();        
     
            // Retrieve the effs
            return TableUtils.getSelectedObjects(getTableModel(),
                    getSelectionModel(), getTableSorter());
        }
    avant le show() le model est ds un état
    pdt le show on peut le modifier (en triant les données affichées autrement
    apres il est dans l'état initial

    Pourtant il n'y a qu'une seule instance du model
    Merci

  13. #13
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    petite precision
    en fait il y a une JDialog qui contient des JtextField (ce sont les zones pour filtrer les données) des boutons et une Jtable (un des boutons permet de remplir la Jtable) apres il y a un bouton valider et un autre annuler (y en a deux autres encore mais il ne sont pas interessant pour ce qui nous concerne )
    Bonne journée
    Merci

  14. #14
    Membre éclairé
    Avatar de seiryujay
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 950
    Par défaut
    Que fait cette méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TableUtils.getSelectedObjects(getTableModel(),
                    getSelectionModel(), getTableSorter());
    ?

  15. #15
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Bonjour,

    Je n'ai pas observé attentivement le code mais logiquement :
    - La JTable ne fait qu'afficher la liste des vols ? Rien n'est éditable ?
    - Donc "l'algorithme" de l'interface est (ou devrait) forcément être du genre :
    *Lecture des données
    *Affichage des données
    , tout simplement...
    Et toujours par logique mais aussi par convention, ce qui est affiché doit l'être en fonction de ce qui est "écrit". C'est à dire que, pour l'exemple, trier la liste doit se faire sur la variable contenant cette liste et non sur la JTable, et seulement ensuite actualiser l'affichage.
    Du moins, c'est ce qui me semble logique (il arrive dans certains cas que l'utilisateur travaille et modifie à volonté la JTable à l'affichage, puis ceci est enregistré dans la variable. Je ne pense pas que ce soit la meilleure solution ici)

    BREF, mes explications ne sont pas toujours clair donc en gros, mon avis est que tu devrais vérifier :
    Qu'est-ce qui est modifié lors d'un tri ?
    - Si c'est la JTable, alors mettre à jour la variable (pas évident)
    - Si c'est la variable, alors repaint() ou revalidate() la JTable (idéal)

    Voilà!

  16. #16
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    bonjour,
    il y a une petite erreur l'appel de la méthode est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TableUtils.getSelectedObjects(getTableModel(), getSelectionModel());
    et voila ce qu'elle fait

    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
     
        /**
         * Get the table selected objects as a List<Object>.
         * 
         * @method getSelectedObjects(TableModel model, ListSelectionModel selectionModel)
         * @return The selected objects.
         */
        public static List getSelectedObjects(TableModel model, ListSelectionModel selectionModel) {
            List selectedObjects = new ArrayList();
            if (!selectionModel.isSelectionEmpty()) {
                int min = selectionModel.getMinSelectionIndex();
                int max = selectionModel.getMaxSelectionIndex();
                Object object;
                for (int i = min; i <= max; i++) {
                    if (selectionModel.isSelectedIndex(i)) {
                        object = model.getValueAt(i, 0);
                        selectedObjects.add(object);
                    }
                }
            }
            return selectedObjects;
        }
    Ensuite pour répondre à BlackWood :
    Oui il n'y a aucune édition des champs, de l'affichage et selection seulement
    Je crois qu'ils sont partis sur la version déconseillée. Est ce que cela implique de grand changement si je dois passer sous la version plus appropriée ?
    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
     
        private Row[] viewToModel;
        private int[] modelToView;
     
        private class MouseHandler extends MouseAdapter {
            public void mouseClicked(MouseEvent e) {
                JTableHeader h = (JTableHeader) e.getSource();
                TableColumnModel columnModel = h.getColumnModel();
                int viewColumn = columnModel.getColumnIndexAtX(e.getX());
                int column = columnModel.getColumn(viewColumn).getModelIndex();
                if (column != -1) {
                    int status = getSortingStatus(column);
                    if (!e.isControlDown()) {
                        cancelSorting();
                    }
                    // Cycle the sorting states through {NOT_SORTED, ASCENDING,
                    // DESCENDING} or
                    // {NOT_SORTED, DESCENDING, ASCENDING} depending on whether
                    // shift is pressed.
                    status = status + (e.isShiftDown() ? -1 : 1);
                    status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0,
                    // 1}
                    setSortingStatus(column, status);
                }
            }
        }
     
       private void sortingStatusChanged() {
            clearSortingState();
            fireTableDataChanged();
            if (tableHeader != null) {
                tableHeader.repaint();
            }
        }
     
        public void setSortingStatus(int column, int status) {
            Directive directive = getDirective(column);
            if (directive != EMPTY_DIRECTIVE) {
                sortingColumns.remove(directive);
            }
            if (status != NOT_SORTED) {
                sortingColumns.add(new Directive(column, status));
            }
            sortingStatusChanged();
        }
     
        private void clearSortingState() {
            viewToModel = null;
            modelToView = null;
        }
    Merci beaucoup de votre aide

  17. #17
    Membre éprouvé Avatar de BlackWood
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 167
    Par défaut
    Mouais... Ils utilisent les fonctions de TableModel, etc. Ca ne m'étonne pas de trop. Le tri me semble correct mais comme je te disais, ils font leurs changements sur ce que contient la table affichée et non la variable contenant la liste des vols. C'est dommage, mais réparable.
    Perso, je vois deux solutions :
    - Soit tu refais une (trés) grosse partie du code afin de changer ce système : donc modifier la variable puis actualiser l'affichage.
    - Soit laisser tel quel et ajouter une méthode qui va reconstruire la variable des vols en fonction de la table affichée, et s'exécuter à la fin de mouseClicked.
    La deuxième solution sera moins longue et pas forcément laborieuse. Aprés, c'est toi qui voit !

  18. #18
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    Je vais essayer ça et je vous tiens au courant
    Merci de votre aide à tous

  19. #19
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 12
    Par défaut
    coucou
    Bon ben en fait c'était juste un mauvais "mapping"
    A la place de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            JTableHeader tableHeader = table.getTableHeader();
    
            TableSorter tableSorter = new TableSorter(getTableModel());
            tableSorter.setTableHeader(tableHeader);
            table.setModel(tableSorter);
    on a mis ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            JTableHeader tableHeader = table.getTableHeader();
    
            TableSorter tableSorter =  getTableSorter();        
            tableSorter.setTableHeader(tableHeader);
            table.setModel(tableSorter);
    Je crois me rappeller que du coté spring on a juste mapper le modele et le table sorter correctement
    Merci de votre aide !!
    A+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme avec utilisation des filtres et des modeles
    Par Djolhan dans le forum Thunderbird
    Réponses: 0
    Dernier message: 08/04/2009, 22h30
  2. Jtable avec model personnalisé
    Par Raphael1980 dans le forum Composants
    Réponses: 2
    Dernier message: 03/03/2009, 21h02
  3. Jtable avec model + Dao + resultSet
    Par Raphael1980 dans le forum Composants
    Réponses: 7
    Dernier message: 01/03/2009, 10h26
  4. [Swing][JTable]pb de header avec Model
    Par yoshï dans le forum Composants
    Réponses: 2
    Dernier message: 19/04/2006, 11h01
  5. [MySQL] probleme d'une requête SQL crée avec phpmyadmin
    Par ghita269 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 24/10/2005, 10h15

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