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 :

Interface producteur/consommateur utilisant SWING


Sujet :

AWT/Swing Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut Interface producteur/consommateur utilisant SWING
    Bonjour,

    Je suis nouveau ici, et également un novice en Java.
    Mon problème est que j'ai à réaliser une interface graphique en Java (SWING) sur un exemple de producteur/consommateur utilisant un buffer borné à 4 places. Les producteurs produisent des lettres consommées ensuite. J'ai écris le code producteur/consommateur/bounded_buffer :

    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
     
    import java.util.*;
    import java.awt.*;
     
    class Buffer extends Vector {
    	//Vector buffer = new Vector(4);
    	private static final long serialVersionUID = 1L;
     
    	public synchronized void put(char donnee) {
    		// TODO Auto-generated method stub
    		// wait while buffer full
    		while(Full()) {
    			try {
    				System.out.println("Buffer full");
    				wait();		// waiting
    			}
    			catch(Exception e) {}
    		}
    		//a free place
    		add(new Character (donnee));
    		notifyAll();	}	//wake up the Threads
     
    	public synchronized char get() {
    		// wait while buffer empty
    		while(Empty()) {
    			try {
    				System.out.println("Buffer empty");
    				wait();		// waiting
    			}
    			catch(Exception e) {}
    		}
    		notifyAll();
    		return((Character)this.remove(0)).charValue();
    	}
    	public boolean Full() {return (size()== 3); }
    	public boolean Empty() {return (size()== 0); }
    }
    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
     
    import java.util.*;
     
    class prod extends Thread {
    	private Buffer buffer;
    	private String donnee;
    	private int id;
     
    	public prod(Buffer buffer, String donnee, int id) {
    		this.buffer = buffer;
    		this.donnee = donnee;
    		this.id = id;
    	}
     
    	public void run () {
    		Random r = new Random();
    		for(int i = 0;i<donnee.length();i++) {
    			//production of the letter
    			System.out.println(this.id + "produced:"+donnee.charAt(i));
    			buffer.put(donnee.charAt(i));
    			try {
    				//random production rythm
    				sleep((r.nextInt())%30);
    			}
    			catch(Exception e) {};
    		}
    		//System.out.println("\nProduction finished");
    	}
     
    }
     
    import java.util.*;
     
    class cons extends Thread{
    	private Buffer buffer;
    	private int nombre ;
    	private int id;
     
    	public cons(Buffer buffer, int nombre, int id) {
    		this.buffer = buffer;
    		this.nombre = nombre;
    		this.id = id;
    	}
     
    	public void run() {
    		Random r = new Random();
    		for(int i = 0;i<nombre;i++) {
    			//consumptiom of the letter
    			char car = buffer.get();
    			System.out.println(this.id + "consumed:"+car);
    			try {
    				//random consumption rythm
    				sleep((r.nextInt())%20);
    			}
    			catch(Exception e) {};
    		}
    		//System.out.println("\nConsumptiom finished");
    	}
    }
    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
     
    public class pr_co {
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		String donnee = "abcdefghijkl";
    		Buffer buffer = new Buffer();
    		prod p1 = new prod(buffer,donnee,1);
    		prod p2 = new prod(buffer,donnee,2);
    		prod p3 = new prod(buffer,donnee,3);
    		cons c1 = new cons(buffer,donnee.length(),1);
    		cons c2 = new cons(buffer,donnee.length(),2);
    		cons c3 = new cons(buffer,donnee.length(),3);
    		p1.start();
    		p2.start();
    		p3.start();
    		c1.start();
    		c2.start();
    		c3.start();
    	}
     
    }
    Je sais que tout ça marche j'ai testé avec eclipse.

    Maintenant, je dois faire l'interface graphique, et je ne sais pas du tout comment faire. A gauche, on doit avoir les producteurs avec leur état (produire, attendre le buffer vide...) et les lettres produites. Au milieu, on doit avoir le buffer avec les 4 places et les lettres qui s'y accumulent ou partent selon qu'elles sont produites ou consommées. Enfin, à droite, on doit avoir les consommateurs sur le même modèle que les producteurs.

    Merci de votre aide, j'espère que vous aurez quelques réponses à mon problème.

  2. #2
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Qu'est-ce qui te pose un probleme au niveau de ton interface?

    Moi je te conseillerais de telecharger le plugin Visual Editor d'Eclipse qui est bien pratique quand on ne connait pas bien la classe Swing.
    Ca te permettrais de faire differents essais au niveau du "skin" et de pas t'embeter a ecrire tout tes JPanel a la main (il faut quand meme se renseigner pour comprendre le code).
    Si tu as des problemes au niveau des Listerner, je trouve que c'est assez intuitif avec ce plugin.

    Pour plus d'info sur ce plugin --> http://java.developpez.com/faq/eclipse/?page=plugins#ve

  3. #3
    Membre actif Avatar de Lethal
    Profil pro
    Développeur Java
    Inscrit en
    Février 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Février 2006
    Messages : 194
    Points : 227
    Points
    227
    Par défaut
    Oui je pense que tu devrais un peu te renseigner car on ne peut pas te faire un cours sur les interface graphiques en swing ici ...

    Une question quande même, doit tu taper tout le code de l'interface graphique ou peut tu utiliser un "assistant"?

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Oui je dois tout écrire tout le code de l'interface graphique moi même sans utiliser "d'assistant".
    Je vais télécharger le plugin pour faire des essais et je poserai une question si besoin.

    Merci.

  5. #5
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Taper entierment le code soi-meme est un peu idiot en passant.... utilises un assistant et modifie ton code en foction tu gagnera enormement de temps

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Peux-tu me dire quel est exactement le rôle de l'assistant et comment on l'utilise ? Il va me générer une interface "standard" que je dois modifier ensuite selon mon projet si je comprend bien. Lequel utiliser ?

    Merci encore.

  7. #7
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Il va rien te generer du tout, il va te permettre sous Eclipse de creer une nouvelle classe "visual class".

    Quand tu generes une telle classe, ce plugin ouvre plusieurs fenetres en plus pour t'aider a la conception graphique :
    - une fenetre de visualisation
    - une barre avec les differents composants possibles
    - une fenetre de parametre de tes beans

    Le truc sympa c'est que tu as juste a cliquer sur le composant voulu et le mettre ou tu veux.
    Tu peux meme allé jusqu'a modifier les Listerners.

    Apres si tu veux modifier le code libre a toi, tu peux meme creer des beans a integrer dans ta fenetre principale. En gros tu peux faire exactement comme en codant a la main mais en voyant tout ce que tu fais en direct... c'est nettement plus facile et surtout carrement plus rapide.

    Va voir la doc : http://www.eclipse.org/vep/WebContent/main.php
    Ya meme une demo video

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonsoir !!!

    Merci pour le Visual Editor, ça m'a bien aidé pour créer l'interface.
    Par contre, il me reste un problème : dans cette interface, j'ai un jButton qui correspond à l'état de mon producteur. Le texte devrait changer selon les différents actions qu'exécute le producteur. Exemple : le buffer est plein, le producteur ne peut pas produire, texte du jButton = "Waiting for buffer not full". Dès qu'un place se libère, on aura "Producing". Je sais que je dois utiliser un listener, mais je ne sais pas comment faire pour le lier avec mes classes producteur et buffer ainsi qu'avec le GUI.

    Pouvez-vous me renseigner (la partie du code est ci-dessus) ?

    Merci d'avance.

  9. #9
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Voir la doc java

    Tu as la methode JButton.setText("ton texte") qui fait exactement ce que tu veux

    Tu as juste à integrer cette methode à un moment donné de tes classes (par exemple lorsque l'action a bien eu lieu --> JButton.setText("Producing") et par defaut tu laisse l'autre texte)

  10. #10
    Membre habitué
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Points : 148
    Points
    148
    Par défaut
    Je crois plutôt que son problème c'est avec l'ajout du listener sur son bouton..

    Moi je conseille de créer une action et de l'ajouter à ton bouton



    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
    81
    82
    83
    84
    85
    86
     
    import java.awt.event.ActionEvent;
    import java.io.File;
    import java.text.MessageFormat;
     
    import javax.swing.Icon;
    mport javax.swing.ImageIcon;
    import javax.swing.JOptionPane;
    import javax.swing.AbstractAction;
     
     
    import ext.testsys.finexplorer.ui.FinBrowser;
     
     
    ////////////////////////////////////////////////////////////////
    // static variables
     
    /**
     * Remember if this form is already active, so that it does
     * not popup twice.
     */
     
     
    /**
     * Action to exit Fin Browser.
     * 
     */
    public class ActionQuit extends AbstractAction {
     
    	public static final ImageIcon CANCEL_IMAGE = new ImageIcon("ext"+File.separator+"testsys"+File.separator+"finexplorer"+File.separator+"ui"+File.separator+"explorer"+File.separator+"icones"+File.separator+"cancel.gif");
     
    	public  ActionQuit() {    
    	super("Quit",CANCEL_IMAGE);
     
        }
     
     
        public  ActionQuit(String actionName) {    
            super(actionName);
     
            }
     
        ////////////////////////////////////////////////////////////////
        // main methods
     
        /**
         * See 
         *
         * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
         */
        public void actionPerformed (ActionEvent ae) {
    	 FinBrowser fb = FinBrowser.getInstance();
    	 String t = MessageFormat.format("Are you sure to want to quit",null);
     int response =
    	JOptionPane.showConfirmDialog(fb, t, t,
    				      JOptionPane.OK_CANCEL_OPTION);
     
     if (response == JOptionPane.CANCEL_OPTION
         	|| response == JOptionPane.CLOSED_OPTION) {
     }
     else
     {	 
    	 System.exit (0);
     }
     
        }
     
     
        /**
         * Execute this action from the command line.
         *
         * @param argument is not used.
         * @return true if it is OK.
         *
         * @see org.argouml.application.api.CommandLineInterface#doCommand(java.lang.String)
         */
        public boolean doCommand(String argument) {
            System.exit (0);
    	return true;
        }
     
        /**
         * The UID.
         */
        private static final long serialVersionUID = -6264722939329644183L;
    } /* end class ActionExit */

    et dans ta methode actionPerformed tu fais changer de label à ton bouton..


    pour associer ton action à ton bouton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cancelButton = new JButton();
    cancelButton.setAction(new ActionQuit());

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Non, c'est vraiment un problème de setText dans le jButton.

    J'ai bien essayé de fait jButton.setText("hh") dans ma classe producteur à un certain moment, mais il me dit que "jButton cannot be resolved" dans cette classe.
    C'est pour cela que je disais que je n'arrivais pas à faire le lien entre ça et mon interface.

  12. #12
    Membre habitué
    Inscrit en
    Mars 2006
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 137
    Points : 148
    Points
    148
    Par défaut
    montre ton code please !!

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Salut !!

    Mon code est le suivant :

    [/code]
    class Producer extends Thread {
    private Buffer buffer;
    private String donnee;
    private int id;

    /**
    * Method: Producer
    * Creation of the producer
    */
    public Producer(Buffer buffer, String donnee, int id) {
    this.buffer=buffer;
    this.donnee=donnee;
    this.id = id;
    }

    /**
    * Method: run
    * Creation of the method that runs the production
    */
    public void run(){
    Random r = new Random();
    for (int i=0;i<donnee.length();i++) {
    //production of the letter
    //notifyBeforePush(); = manipulating buffer
    System.out.println(this.id + "produced:"+ donnee.charAt(i));
    buffer.putCharacter(donnee.charAt(i));
    //notifyBeforeWork(); = producing
    jButton.setText("er)");
    try {
    //random production rythm
    sleep((r.nextInt())%30);
    }
    catch(Exception e){}
    }
    //System.out.println("\nProduction terminee");
    }
    }class Buffer extends Vector {
    private static final long serialVersionUID = 1L;

    /**
    * Method: putCharacter
    * Creation of the method that allows to put a character
    * in the buffer
    */
    public synchronized void putCharacter(char donnee) {
    while(Full()) { // wait while buffer full
    try {
    System.out.println("Buffer full");
    wait(); // waiting
    }
    catch(Exception e) {}
    }
    //a free place
    add(new Character (donnee));
    notifyAll(); } //wake up the Threads

    /**
    * Method: getCharacter
    * Creation of the method that allows to get a character
    * from the buffer
    */
    public synchronized char getCharacter() {
    while(Empty()) { // wait while buffer empty
    try {
    System.out.println("Buffer empty");
    wait(); // waiting
    }
    catch(Exception e) {}
    }
    notifyAll(); //wake up the Threads
    return((Character)this.remove(0)).charValue();
    }
    public boolean Full() {return (size()== 3); }
    public boolean Empty() {return (size()== 0); }
    }
    class Consumer extends Thread{
    private Buffer buffer;
    private int nombre ;
    private int id;

    /**
    * Method: Consumer
    * Creation of the consumer
    */
    public Consumer(Buffer buffer, int nombre, int id) {
    this.buffer = buffer;
    this.nombre = nombre;
    this.id = id;
    }

    /**
    * Method: run
    * Creation of the method that runs the consumption
    */
    public void run() {
    Random r = new Random();
    for(int i = 0;i<nombre;i++) {
    //consumptiom of the letter
    char car = buffer.getCharacter();
    System.out.println(this.id + "consumed:" + car);
    try {
    //random consumption rythm
    sleep((r.nextInt())%40);
    }
    catch(Exception e) {};
    }
    //System.out.println("\nConsumptiom finished");
    }
    }
    public class Prod_cons {

    public static void main(String[] args) {
    String donnee = "abcdefghijkl";
    Buffer buffer = new Buffer();
    Producer p1 = new Producer(buffer,donnee,1);
    Producer p2 = new Producer(buffer,donnee,2);
    Producer p3 = new Producer(buffer,donnee,3);
    Consumer c1 = new Consumer(buffer,donnee.length(),1);
    Consumer c2 = new Consumer(buffer,donnee.length(),2);
    Consumer c3 = new Consumer(buffer,donnee.length(),3);
    GUI gui = new GUI(p1);
    p1.start();
    p2.start();
    p3.start();
    c1.start();
    c2.start();
    c3.start();
    }

    }

  14. #14
    Membre averti Avatar de let_me_in
    Inscrit en
    Mai 2005
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 441
    Points : 437
    Points
    437
    Par défaut
    dans ce code je ne vois qu'une seule reference a ton bouton:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     jButton.setText("er)");
    ou est donc la declaration ??

  15. #15
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Voilà la déclaration

    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
    import java.awt.GridBagLayout;
    import javax.swing.JPanel;
    import javax.swing.JButton;
    import java.awt.GridBagConstraints;
     
    public class GUI extends JPanel {
     
    	private static final long serialVersionUID = 1L;
    	 JButton jButton = null;
     
    	/**
             * This is the default constructor
             */
    	public GUI(Producer prod) {
    		super();
    		initialize(prod);
    	}
     
    	/**
             * This method initializes this
             * 
             * @return void
             */
    	public void initialize(Producer prod) {
    		GridBagConstraints gridBagConstraints = new GridBagConstraints();
    		gridBagConstraints.gridx = 0;
    		gridBagConstraints.gridy = 0;
    		this.setSize(300, 200);
    		this.setLayout(new GridBagLayout());
    		this.add(getJButton(), gridBagConstraints);
    	}
     
    	/**
             * This method initializes jButton      
             *      
             * @return javax.swing.JButton  
             */
    	public JButton getJButton() {
    		if (jButton == null) {
    			jButton = new JButton();
    			jButton.setText("tt");
     
    		}
    		return jButton;
    	}
    }

  16. #16
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    J'ai créé 3 JFrame qui correspondent à mes 3 producteurs, mais quand je lance le programme, les 3 fenetres sont superposées. Quel est le moyen de mettre ces fenetres les unes en dessous des autres ? Je n'arrive pas à trouver comment faire.

    Merci de vos suggestions.

  17. #17
    Membre habitué Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Points : 177
    Points
    177
    Par défaut
    Tu as deux méthode :
    - setLocation(x,y) dans la classe Component--> la premiere s'ouvrant aux positions (0,0), la second tu met un truc du genre : (0,0+taille JFrame1) et la troisieme (0,0+taille 1&2)


    - setLocationRelativeTo dans la classe Window --> tu associes la position de ta Jframe 2 par rapport à celle de la Jframe 1 et etc...


    PS: Ca m'a pris deux minutes a trouver dans la doc de JFrame (vive la javadoc)

  18. #18
    Nouveau Candidat au Club
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 1
    Points
    1
    Par défaut
    Merci pour les JFrame, ça marche très bien maintenant.

    J'ai encore une autre question qui semble idiote mais à laquelle je ne trouve pas de réponse. Je veux maintenant écrire dans un JLabel un seul caratère, de type char appelé donnee. Or, quand je fait un setText("Character:" +donnee+""), eclipse me dit que l'on ne peut pas mettre autre chose qu'une chaine de caractère, ce qui est normal.

    Avez-vous une astuce pour afficher le caractère dan sle JLabel ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/04/2008, 16h29
  2. Réponses: 8
    Dernier message: 16/04/2007, 16h10
  3. Sémaphores Producteur consommateur Windows
    Par Artusamak dans le forum Windows
    Réponses: 4
    Dernier message: 06/04/2007, 09h40
  4. [Threads]Producteur - Consommateur - Filemessages
    Par slim dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 08/03/2006, 18h57
  5. Réponses: 8
    Dernier message: 09/02/2006, 18h51

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