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 :

JProgressBar avant ouverture application


Sujet :

AWT/Swing Java

  1. #1
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut JProgressBar avant ouverture application
    Bonjour,

    J'ai actuellement une appli qui permet l'ouverture/fermeture de certains ports de pare-feu (si besoin, voir code et screenshots ici).
    Etant donné que j'actualise les boutons et voyants d'états des connexions au démarrage de l'appli, avant de rendre la JFrame visible, celà prends un peu de temps avant que l'appli soit visible (environ 4 secondes).

    Je souhaiterai insérer une barre de chargement pendant l'attente de ces 4 secondes (qui pourront devenir plus si des connexions sont rajoutées par la suite), pour "rassurer" l'utilisateur quant à l'ouverture de l'appli.
    J'ai trouvé un code de barre de progression, mais elle s'exécute au clic sur un bouton et le temps de chargement semble prédéfini...

    Comment puis-je adapter cela pour que la JProgressBar se lance dès le début, se ferme lorsque la fenêtre principale devient visible, et que la progression soit bien proportionnelle au temps de "chargement" de mon appli ?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Exactement de la même façon que tu affiches ta JFrame principale, tu peux dès le lancement afficher une JFrame qui affiche une JProgressBar et fermer cette dernière quand tu affiches la principale, soit explicitement en faisant un dispose() juste avant le setVisible(true) soit sur évènement (ComponentListener/ComponentAdapter).

    Par contre, pour la progression, il te faudra la gérer. Il est quasiment impossible de gérer une progression sur la notion de temps (le temps d'exécution dépend du contexte d'exécution, de la machine, et tes 4 secondes peuvent varier). Il faut gérer la progression en terme d'étapes : découper ton process de démarrage en étapes. Ensuite, tu peux faire un affichage du temps restant, en mesurant le temps pour les étapes déjà réalisées et en le comparant au nombre d'étapes total (de la même façon que pour déterminer un pourcentage, ou tu ferais nombre d'étapes réalisées / nombre d'étapes total * 100). Evidemment, si une étape prend plus de temps qu'une autre, la progression ne sera proportionnelle. Éventuellement, si tu peux déterminer par avance que certaines étapes sont forcément plus longues que d'autres, leur attribuer un poids. Exactement comme on traiterait un calcul de moyenne de notes, où certaines ont un coefficient plus important que d'autres.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    D'abord merci de cette réactivité !

    J'ai donc réussi à intégrer la barre de chargement avec un "temps fixe" qui colle à peu près avec le temps d'apparition de mon appli.
    Peux-tu m'indiquer comment je dois me dévrouiller si je veux que la barre se charge au fur et à mesure des connexions qui s'effecture stp.
    Voici mon code, avec en gras les parties qui je pense, sont concernées :

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    public class Vue extends JFrame {
    
    	private static final long serialVersionUID = 1L;
    	Controleur firewall = new Controleur();	
    	JPanel panel = new JPanel();
    	JPanel paneln = new JPanel();
    	JPanel panels = new JPanel();
    	JPanel panelw = new JPanel();
    	JPanel panelc = new JPanel();
    	JPanel panele = new JPanel();
    	JLabel image = new JLabel(new ImageIcon(this.getClass().getResource("logoVPN.png")));
    	JButton refresh = new JButton("Actualiser");
    	
    	public Vue(){
    		barre b = new barre();
    		Color background = new Color(255,228,202);
    		panel.setLayout(new BorderLayout(6,12));
    		panel.add(paneln, BorderLayout.NORTH);
    		panel.add(panelw, BorderLayout.WEST);
    		panel.add(panelc, BorderLayout.CENTER);
    		panel.add(panele, BorderLayout.EAST);
    		panel.add(panels, BorderLayout.SOUTH);
    		paneln.add(image);
    		panelw.setLayout(new GridLayout(firewall.getListAcces().size(),1,0,3));
    		panelc.setLayout(new GridLayout(firewall.getListAcces().size(),1,0,3));
    		panele.setLayout(new GridLayout(firewall.getListAcces().size(),1,0,3));
    		int[] varHeightWidthFrameSize = buildComponent();
    		refresh.addActionListener(new GestionActionRefreshListener(firewall));
    		panels.add(refresh);
    		panelw.setPreferredSize(new Dimension(varHeightWidthFrameSize[1]*7,300));
    		panel.setBackground(background);
    		paneln.setBackground(background);
    		panels.setBackground(background);
    		panele.setBackground(background);
    		panelw.setBackground(background);
    		panelc.setBackground(background);
    		this.setTitle("Gestion Accès VPN");
    		this.setSize(190+(varHeightWidthFrameSize[1]*7),125+(varHeightWidthFrameSize[0]*31));
    		this.setResizable(false);
    		this.addWindowListener(new GestionWindowListener(firewall));
    		this.setLocationRelativeTo(null);
    		this.setContentPane(panel);
    		this.setVisible(true);
    		defaultPopup();
    	}
    	
    	private int[] buildComponent(){
    		int varFrameSize[] = {0,0};
    		for(int j=0 ; j<firewall.getListAcces().size() ; j++){
    			Controleur.Acces acces = firewall.getListAcces().get(j);
    			boolean etatConnexion = firewall.getEtatAcces(acces);
    			panelw.add(new JLabel(acces.getLabel(),javax.swing.SwingConstants.CENTER));
    			for(int i=0 ; i<acces.getBoutons().length ; i++){
    				acces.getBoutons()[i].addActionListener(new GestionActionListener(firewall,acces,acces.getBoutons()[i].getText()));
    				panelc.add(acces.getBoutons()[i]);
    			}
    			panele.add(acces.getEtat());
    			firewall.actualiserEtat(acces,etatConnexion);
    			firewall.actualiserBoutons(acces,etatConnexion);
    			if(acces.getLabel().length()>varFrameSize[1]){
    				varFrameSize[1] = acces.getLabel().length();
    			}
    			varFrameSize[0]++;
    		}
    		return varFrameSize;
    	}
    	
    	private void defaultPopup(){
    		if(firewall.getModeDefault()){
    			String message_default = "       Le fichier de configuration des accès est introuvable.\r\n";
    			message_default+= "           Vous ne bénéfiecierez que des accès par défaut.\r\n";
    			message_default+= "Si le problème persiste : contactez l'Activité Informatique";
    			String titre_default = "Fichier de configuration introuvable";
    			JOptionPane.showMessageDialog(this,message_default,titre_default,JOptionPane.WARNING_MESSAGE);
    		}
    	}
    	
    	public class barre extends JFrame{
    
    		private static final long serialVersionUID = 1L;
    		private Thread t;
    	  	private JProgressBar bar;
    	   
    	  	public barre(){      
    	  		this.setSize(300, 60);
    	  		this.setTitle("Chargement...");
    	  		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	  		this.setLocationRelativeTo(null);      
    	      
    	  		t = new Thread(new Traitement(this));
    	  		bar  = new JProgressBar();
    	  		bar.setMaximum(400);
    	  		bar.setMinimum(0);
    	  		bar.setStringPainted(true);
    	      
    	  		this.getContentPane().add(bar, BorderLayout.CENTER);      
    	  		t.start();      
    	  		this.setVisible(true);  
    	  	}
    
    	  	class Traitement implements Runnable{  
    		  
    	  		JFrame jf = new JFrame();
    		
    	  		public Traitement(JFrame jfr){
    	  			jf = jfr;
    	  		}
    		
    	  		public void run(){       
    	  			for(int val = 0; val <= 400; val++){
    	  				bar.setValue(val);
    	  				try {
    	  					t.sleep(11);
    	  				}catch (InterruptedException e) {
    	  					e.printStackTrace();
    	  				}
    	  			}
    	  			jf.dispose();
    	  		}   
    	  	}
    	}	
    	public static void main(String[] args){
    		new Vue();
    	}
    }

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il y a toujours 2 approches dans ce genre de choses : l'évènementielle et la classique. J'ai tendance à préférer l'évènementielle, mais dans ton cas, je pense que la classique sera plus simple à mettre en oeuvre. Ensuite, on pourrait envisager de faire un SwingWorker, bien que ta construction de fenêtre ne le nécessite pas.

    Mais avant tout, il semble que la méthode qui fait le traitement progressif soit la méthode buildComponent(), n'est ce pas ? Si c'est bien ça, firewall.getListAcces().size() est donc le nombre d'étapes total, et chaque itération de la boucle for(int j une étape. Si tu passes la référence de barre en paramètre de buildComponent et que tu ajoutes à cette classe (barre) une méthode setProgress(int value) qui appelle bar.setValue(value), tu auras directement la progression correspondante à cette boucle.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Cool !
    J'ai fait comme tu m'as dit et ça fonctionne très bien.
    J'ai viré le Thread du coup puisque ce n'était plus la méthode run() qui faisait progresser ma barre ; et j'ai modifié les éléments en gras :

    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    public class Vue extends JFrame {
    
    	private static final long serialVersionUID = 1L;
    	Controleur firewall = new Controleur();	
    	JPanel panel = new JPanel();
    	JPanel paneln = new JPanel();
    	JPanel panels = new JPanel();
    	JPanel panelw = new JPanel();
    	JPanel panelc = new JPanel();
    	JPanel panele = new JPanel();
    	JLabel image = new JLabel(new ImageIcon(this.getClass().getResource("logoVPN.png")));
    	JButton refresh = new JButton("Actualiser");
    	int nbrAcces = firewall.getListAcces().size();
    	
    	public Vue(){
    		barre b = new barre();
    		Color background = new Color(255,228,202);
    		panel.setLayout(new BorderLayout(6,12));
    		panel.add(paneln, BorderLayout.NORTH);
    		panel.add(panelw, BorderLayout.WEST);
    		panel.add(panelc, BorderLayout.CENTER);
    		panel.add(panele, BorderLayout.EAST);
    		panel.add(panels, BorderLayout.SOUTH);
    		paneln.add(image);
    		panelw.setLayout(new GridLayout(firewall.getListAcces().size(),1,0,3));
    		panelc.setLayout(new GridLayout(firewall.getListAcces().size(),1,0,3));
    		panele.setLayout(new GridLayout(firewall.getListAcces().size(),1,0,3));
    		int varWidthSize = buildComponent(b);
    		refresh.addActionListener(new GestionActionRefreshListener(firewall));
    		panels.add(refresh);
    		panelw.setPreferredSize(new Dimension(varWidthSize*7,300));
    		panel.setBackground(background);
    		paneln.setBackground(background);
    		panels.setBackground(background);
    		panele.setBackground(background);
    		panelw.setBackground(background);
    		panelc.setBackground(background);
    		this.setTitle("Gestion Accès VPN");
    		this.setSize(190+(varWidthSize*7),125+(nbrAcces*31));
    		this.setResizable(false);
    		this.addWindowListener(new GestionWindowListener(firewall));
    		this.setLocationRelativeTo(null);
    		this.setContentPane(panel);
    		this.setVisible(true);
    		defaultPopup();
    	}
    	
    	private int buildComponent(barre b){
    		int longerLabel = 0;
    		for(int j=0 ; j<firewall.getListAcces().size() ; j++){
    			b.setProgress(j);
    			Controleur.Acces acces = firewall.getListAcces().get(j);
    			boolean etatConnexion = firewall.getEtatAcces(acces);
    			panelw.add(new JLabel(acces.getLabel(),javax.swing.SwingConstants.CENTER));
    			for(int i=0 ; i<acces.getBoutons().length ; i++){
    				acces.getBoutons()[i].addActionListener(new GestionActionListener(firewall,acces,acces.getBoutons()[i].getText()));
    				panelc.add(acces.getBoutons()[i]);
    			}
    			panele.add(acces.getEtat());
    			firewall.actualiserEtat(acces,etatConnexion);
    			firewall.actualiserBoutons(acces,etatConnexion);
    			if(acces.getLabel().length()>longerLabel){
    				longerLabel = acces.getLabel().length();
    			}
    		}
    		b.setProgress(nbrAcces);
    		b.dispose();
    		return longerLabel;
    	}
    	
    	private void defaultPopup(){
    		if(firewall.getModeDefault()){
    			String message_default = "       Le fichier de configuration des accès est introuvable.\r\n";
    			message_default+= "           Vous ne bénéfiecierez que des accès par défaut.\r\n";
    			message_default+= "Si le problème persiste, contactez l'Activité Informatique";
    			String titre_default = "Fichier de configuration introuvable";
    			JOptionPane.showMessageDialog(this,message_default,titre_default,JOptionPane.WARNING_MESSAGE);
    		}
    	}
    	
    	public class barre extends JFrame{
    		private static final long serialVersionUID = 1L;
    	  	private JProgressBar bar;
    	   
    	  	public barre(){      
    	  		this.setSize(300, 60);
    	  		this.setTitle("Chargement...");
    	  		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	  		this.setLocationRelativeTo(null);      	      
    	  		bar  = new JProgressBar();
    	  		bar.setMaximum(nbrAcces);
    	  		bar.setMinimum(0);
    	  		bar.setStringPainted(true);	      
    	  		this.getContentPane().add(bar, BorderLayout.CENTER);         
    	  		this.setVisible(true);  
    	  	}
    	  	
    	  	public void setProgress(int value){
    	  		bar.setValue(value);
    	  	}
    	}
    	
    	public static void main(String[] args){
    		new Vue();
    	}
    }
    Par contre, même si ma barre progresse progressivement avec la création de chaque nouvel Acces, elle ne progresse pas de manière fluide (/continue), mais passe de 0% à 7% à 14% à 21%... Normal étant donnée que j'ai 14 accès ; mais y a-t-il une astuce pour la faire passer par toutes les valeurs de 0 à 100 en gardant un chargement proportionnel au nombre d'accès ?

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre du Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2014
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Octobre 2014
    Messages : 99
    Points : 45
    Points
    45
    Par défaut
    Ah oui, ça n'a pas l'air aussi simple que j'aurai pu l'imaginer

    Vu le peu d'importance que ça a pour mon appli, je ne pense finalement pas allourdir mon code avec ça.
    Mais je garde le lien sous la main
    Merci encore!

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Justement, ça devient simple si tu utilises la classe SmoothProgressBarManager dont j'ai mis le source dans le post 2.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. executer un programme avant ouverture session
    Par pitikak dans le forum Windows XP
    Réponses: 14
    Dernier message: 21/07/2007, 15h15
  2. Test avant ouverture de fichier
    Par Yves2507 dans le forum Access
    Réponses: 6
    Dernier message: 10/09/2006, 09h57
  3. D7/ouverture application mail
    Par jer64 dans le forum Delphi
    Réponses: 4
    Dernier message: 14/08/2006, 14h35
  4. [VBA-E] evenement avant quitter application
    Par fisherman dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/05/2006, 13h11
  5. Bouton submit grisé avant ouverture lien
    Par Ben42 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 30/01/2006, 17h04

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