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

AWT/Swing Java Discussion :

Superposition de plusieurs Container


Sujet :

AWT/Swing Java

  1. #21
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Parce que j'ai lu quelque part que c'était plus optimisé d'appeler update et de ne dessiner que ce qui change plutot que d'appeler paint et de tout redessiner. Ils appelaient ca "Incremental painting" je crois.

  2. #22
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Commences par faire quelque chose qui marche avant de chercher à l'optimiser.

    Pour citer Donald Knuth: "Premature optimization is the root of all evil" (l'optimisation prématurée est la source de tous les maux).
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  3. #23
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    C'est vrai, mais après ce que tu m'as dis, j'ai essayé d'utiliser la méthode paint mais les animations ne s'affichent pas, je sais qu'elles s'exécutent (je le rappelle chaque animation a son propre thread) mais, à l'écran, rien ne change. Je ne sais pas encore si ca vient d'une mauvaise gestion des héritages ou si c'est parce que je n'appelle pas paint correctement mais en tout cas, ca ne fonctionne pas . Je ferai un up dés que je saurai d'où ca vient.

    Je vais essayer de te montrer l'arborescence du projet :

    public class abstract Animatable extends Container implements Thread :
    • crée une animation avec comme méthode à redéfinir ce qui sera à exécuter dans run(). Lorsque je crée des animations je redéfinis la méthode paint() et je fais les modifications. J'ai un doute sur le fait que cette méthode paint ne soit pas placée au bon endroit et que c'est pour ca que l'animation ne s'affiche pas.
    • Dans la méthode paint, je fais les modifications sur l'argument de type Graphics et je n'appelle aucune autre méthode paint. Peut être devrais-je appeler super.paint ou parent.paint et remonter comme cela jusqu'au Container père de tout le monde ?


    public class Button extends Container :
    • contient 4 Animatable (qui sont les fils du Button) différentes déjà instanciées, en fonction de l'état du bouton, telle ou telle animation est jouée, je ne me sers pas de la méthode paint (peut être devrais-je ? Et dans ce cas que dois-je dessiner ?)


    public class Menu extends Container implements ButtonListener :
    • contient une liste de Button (les Button sont les fils du Menu) instanciés aussi, je ne me sers pas non plus de la méthode paint (même question). ButtonListener est l'écouteur d'évenements sur les boutons.

    public class Navigator :
    • contient une liste de Menus déjà instanciés. Les Menus affichés sont les fils d'un Container de base qui fait toute la taille de l'écran.


    J'espère être clair, je ne peux pas mettre le code car il y aurait trop d'informations superflues et on s'y perdrait. Dis moi si tu as une question.


    Merci vraiment beaucoup, je me doute que ca ne doit pas être limpide mais je fais ce que je peux l'être le plus possible.

  4. #24
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Lorsque j'appelle dans les fonctions paint de Animatable, Button et Menu this.getParent().paint(Graphics), il me fait un beau OutOfMemory, je ne comprends pas trop pourquoi, ca doit être une boucle infinie mais je ne comprends pas à quoi elle est dûe.

  5. #25
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    La fonction paint des parents appelle par essence le paint des enfants.

    Donc forcément tu tournes en rond.

    Sinon comment se débruoille l'animation pour bouger? Le thread déclenche un repaint toutes les x millisecondes après chaque recalcul de position? Ce sont les composants en eux même qui bougent (très lourd comme opération en général) ou le paint du composant qui affiche quelque chose de différent (vachement plus léger)?
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  6. #26
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Aaaaa ok merci.

    En ce qui concerne les animations, le thread a une boucle gérée par un booléen pour que je puisse l'arreter. A chaque tour de boucle, la fonction doAnimation est appelée et c'est dedans que les appels à paint sont fait. Je te met le bout de code correspondant a une animation.

    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
     
    public void doAnimation() {
    	System.out.println(super.toString());
    	try {
    		Graphics g = this.getGraphics();
    		this.loop = 0;
    		for (int i = 0; i < 20; i++) {
    			this.paint(g);
    			try {
    				Thread.sleep(50);
    			} catch (InterruptedException e) {
    			}
    		}
    		this.loop = 1;
    		g = this.getGraphics();
    		for (int i = 0; i < 20; i++) {
    			this.paint(g);
    			try {
    				Thread.sleep(50);
    			} catch (InterruptedException e) {
    			}
    		}
    	} catch (Exception e) {
    	}
    }
     
    public void paint(Graphics g) {
    	Picture p = this.picturesList_[0];
    	if (this.loop == 0) {
    		g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight());
    		g.drawImage(p.getImage(), p.getX() + 10, p.getY(), p.getWidth(), p.getHeight(), null);
    		p.setX(p.getX() + 10);
    	} else {
    		g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight());
    		g.drawImage(p.getImage(), p.getX() - 10, p.getY(), p.getWidth(), p.getHeight(), null);
    		p.setX(p.getX() - 10);
    	}
    }
    Je le rappelle Animatable hérite de Container donc normalement la fonction paint redéfinit celle du Container.

    C'est animation bateau mais c'est juste pour tester.

    Je ne pourrai répondre que demain.

    Merci BEAUCOUP !

  7. #27
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Ton doAnimation est comment dire, de type pas bien du tout.

    Il ne faut surtout pas utiliser le getGraphics d'un composant pour dessiner dessus (cf mon second message de la discussion). En effet les graphics correspondent au contexte graphique à un instant t. De fait 20 s plus tard les graphics de ton composant ont peut être changé et de fait ceux que tu as stockés sont totalement hors contexte par rapport )à l'état actuel du composant.
    Au lieu de combiner le getGraphics/paint il te suffit de faire un appel à repaint dans ta boucle for point barre.

    Et penses au super.paint(g) dans la redéfinition du paint, sinon les composants contenus ne s'afficheront pas forcément.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #28
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    D'accord, j'avais mal compris pour l'utilisation de getGraphics.

    J'ai bien rajouté super.paint(g) et utilisé repaint plutot que paint, faut-il que je surcharge update ou pas ? Parce que l'animation ne se joue pas, il n'y a que la première image qui s'affiche.

    Les Containers parents ont-ils un rôle dans l'affichage de l'animation ? Actuellement, Menu et Button ne font qu'un appel à super.paint dans leur fonction paint. Dois-je redessiner quelque chose sachant que les seules modifications sont les animations ?

    Merci.

  9. #29
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Bon un exemple simple d'animation en AWT pour que tu comprenne le concept:
    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
    72
    73
    74
    75
    76
    77
    78
    79
    80
    package awt.tests;
     
    import java.awt.Color;
    import java.awt.Component;
    import java.awt.Frame;
    import java.awt.Graphics;
    import java.awt.GridLayout;
    import java.awt.Panel;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
     
    public class AwtAnimation extends Component implements Runnable {
     
        private int circlePosition = 0;
        private int circleRadius = 20;
     
        public AwtAnimation() {
            new Thread(this).start();
        }
     
        /*
         * (non-Javadoc)
         *
         * @see java.awt.Component#paint(java.awt.Graphics)
         */
        @Override
        public void paint(Graphics g) {
            // TODO Auto-generated method stub
            super.paint(g);
            Graphics myG = g.create();
            int height = getHeight();
            g.setColor(Color.blue);
            g.fillOval(circlePosition, height / 2 - circleRadius, 2 * circleRadius, 2 * circleRadius);
            myG.dispose();
        }
     
        @Override
        public void run() {
            try {
                while (true) {
                    Thread.sleep(20);
                    circlePosition += 2;
                    if (circlePosition + circleRadius * 2 > getWidth()) {
                        circlePosition = 0;
                    }
                    repaint();
                }
     
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
     
        public static void main(String[] args) {
            final Frame f = new Frame();
            Panel p = new Panel();
            p.setLayout(new GridLayout());
            p.setBackground(Color.red);
            Panel leftPane = new Panel();
            leftPane.setBackground(Color.yellow);
     
            p.add(leftPane);
            AwtAnimation anim = new AwtAnimation();
            // anim.setBackground(new Color(0, 255, 0, 255));
            p.add(anim);
            f.add(p);
            f.setSize(400, 300);
            f.setLocationRelativeTo(null);
            f.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    // TODO Auto-generated method stub
                    super.windowClosing(e);
                    System.exit(0);
                }
            });
            f.setVisible(true);
        }
    }
    Bon par contre c'est basique, ça scintille, y'a pas de double buffering & cie , j'ai pas cherché à faire dans l'optimal mais juste un exemple
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  10. #30
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par Cbonniot Voir le message
    je me doute que ca ne doit pas être limpide mais je fais ce que je peux l'être le plus possible.
    Alors construit un court exemple indépendant et compilable. Oui, je sais que ce n'est pas facile à construire, mais c'est généralement le chemin le plus rapide vers la solution

  11. #31
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Merci, je vais regarder ca et je verrai bien ce qui est différent.

  12. #32
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Ce que j'ai noté de différent c'est que tu utilises un Panel en tant que composant père alors que moi ce ne sont que des Containers, est ce que ca peut avoir un rapport ?

    J'avais lu quelque chose sur les "lightweight components" et les "heavyweight components" et j'avais cru comprendre qu'il fallait qu'il y ait un "heavyweight component" pour que tout puisse se dessiner. Je pense qu'un Panel en est un.

    Sinon pour l'appel à repaint et le corps de la fonction paint, on a la même chose. Donc si ce n'est pas à cause du Panel, je ne comprends pas pourquoi il ne met pas à jour l'écran.

  13. #33
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Voici ce que j'ai, et cela a pour effet d'afficher "p" qu'une fois, le placement de "super.paint(g)" au début ou à la fin de la fonction ne change rien.

    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
    Animatable active1 = new Animatable(pictures1, true) {
    	private int loop = 0;
    	public void paint(Graphics g) {
    		Picture p = this.picturesList_[0];
    		if (this.loop == 0) {
    			g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight());
    			g.drawImage(p.getImage(), p.getX() + 10, p.getY(), p.getWidth(), p.getHeight(), null);
    			p.setX(p.getX() + 10);
    		} else {
    			g.clearRect(p.getX(), p.getY(), p.getWidth(), p.getHeight());
    			g.drawImage(p.getImage(), p.getX() - 10, p.getY(), p.getWidth(), p.getHeight(), null);
    			p.setX(p.getX() - 10);
    		}
    		super.paint(g);
    	}
    	public void update(Graphics g) {
    	}
    	public void doAnimation() {
    		System.out.println(super.toString());
    		try {
    			this.loop = 0;
    			for (int i = 0; i < 20; i++) {
    				this.repaint();
    				try {
    					Thread.sleep(50);
    				} catch (InterruptedException e) {
    				}
    			}
    			this.loop = 1;
    			for (int i = 0; i < 20; i++) {
    				this.repaint();
    				try {
    					Thread.sleep(50);
    				} catch (InterruptedException e) {
    				}
    			}
    		} catch (Exception e) {
    		}
    	}
    };
    Je le rappelle, un Container contient Menu extends Container qui contient Button extends Container qui contient Animatable extends Container.

    L'application est destinée à tourner sur des platines de lecture Blu-Ray, je suis limité à la JDK 1.31 et le Container qui est le père de tous les Container est contenu dans un HScene. Voila vous avez à peu près tous les détails.

    Description de HScene :

    java.lang.Object
    extended by java.awt.Component
    extended by java.awt.Container
    extended by org.havi.ui.HScene

    "void paint(Graphics g) :
    HScene objects override the paint method (defined in java.awt.Component) to paint the added "child" components on top of an optional background color or image.", Javadoc.

  14. #34
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Et le run de ton Animatable appele doAnimation de quelle façon?
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #35
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() {
    	this.setVisible(true);
    	do {
    		doAnimation();
    	}
    	while ((this.loop_));
    	this.loop_ = this.isInfinit_;
    	this.setVisible(false);
    }
    isInfinit_ est donné lors de la création et il définit si l'animation va être jouée 1 fois ou indéfiniment.

    J'ai rajouté des précisions dans mon post d'avant.

    Merci.

  16. #36
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Commencer par supprimer la redéfinition d'update qui est vide dans animatable.
    Ca semble suspect
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  17. #37
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    C'est fait, mais le résultat est le même, pas de mouvements. Si tu as besoin d'informations ou de bouts de codes, n'hésite pas à me les demander.

    Merci vraiment pour ton aide.

  18. #38
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Je pense que le problème ne vient plus des animations mais des Container du dessus qui ne doivent pas bien faire leur boulot, non ?

  19. #39
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Celà veut dire que des composants sont affichés par dessus ton animation?
    As tu essayé de travailler avec une animation super simple comme celle que j'ai montré au dessus?
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  20. #40
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 39
    Points
    39
    Par défaut
    Non, je n'affiche pas de composants par dessus, les animations ne sont pas mères.

    Oui j'ai essayé de modifier l'exemple que tu m'as donné, j'ai remplacé tous les Panels par des Containers pour que cela ressemble plus à ce que je fais et les couleurs d'arrière plan ne s'affichent pas mais l'animation se joue correctement et je ne comprends pas pourquoi les miennes non car on a presque la même chose au niveau du dessin.

    Faut-il que j'utilise validate() ?

Discussions similaires

  1. [XL-2010] Superposition de plusieurs graphes dans un seul
    Par Matrixmax dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 19/02/2013, 18h44
  2. [Débutant] superposition entre plusieurs images
    Par crespo 12 dans le forum Images
    Réponses: 1
    Dernier message: 25/06/2012, 12h57
  3. [AC-2007] [SQL/VBA] Superposition de plusieurs graphiques
    Par Tifriis dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/12/2010, 10h19
  4. Réponses: 1
    Dernier message: 09/11/2009, 12h30
  5. Superposer plusieurs containers
    Par jaujau dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 28/03/2008, 16h27

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