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 :

[JProgressBar] Afficher barre d'attente pendant traitement


Sujet :

Composants Java

  1. #1
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut [JProgressBar] Afficher barre d'attente pendant traitement
    Bonjour à tous,

    j'ai décidé d'ajouter un JProgressBar à une de mes appli car dans certains cas le traitement est long.

    Le problème est que même en mettant ma JProgressBar dans un Thread, elle ne s'affiche correctement qu'après le traitement!

    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
    if(testParametres()==true)
    				{
    					if(testCles()==true)
    					{
    						ProgressBarre progres = new ProgressBarre();
    						Thread progBar = new Thread(progres);
    						progBar.start();
     
    						String messageAcoder = area.getText();
    						String clePub = clePublic.getText();
    						String clePriv = clePrivee.getText();
     
    						KeyCross k = new KeyCross();
    						String secretKey = k.KeyCrossing(clePub,clePriv);
     
     
    						Encoding encoding = new Encoding();
    						try 
    						{
    							encoding.read(messageAcoder);
    							encoding.codeLecture(clePub);
    							/**2eme passage dans la boucle de cryptage*/
    							encoding.read(Codage.getFuturFile());
    							encoding.codeLecture(clePriv);
    							/**3eme passage dans la boucle de cryptage*/
    							encoding.read(Codage.getFuturFile());
    							encoding.codeLecture(secretKey);
     
    						} 
    						catch (IOException e) 
    						{
    							e.printStackTrace();
    						}
     
    						String messageCode=Codage.getFuturFile();
    						messageCode+="#";
    						area.setText(messageCode);
    						barreEtat.setText("Codage du message éffectué !");
    					}
    					else
    					{
    						JOptionPane.showConfirmDialog(fenetre,"Clés invalides, aucun accents, chiffre, ou apostrophe tolérés","Erreur clés",JOptionPane.OK_CANCEL_OPTION,JOptionPane.ERROR_MESSAGE);
    					}
     
    				}
    				else
    				{
    					JOptionPane.showConfirmDialog(fenetre,"Vous devez entrer les paramètres","Erreur paramètres",JOptionPane.OK_CANCEL_OPTION,JOptionPane.ERROR_MESSAGE);
    				}
    Une idée ?

  2. #2
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Consulte la FAQ par exemple: ici

    Utilise un thread pour ta progress bar .. qqun avait sensiblement le meme probleme que toi ya pas 5min ..

    Merci de faire un minimum de recherche avant de poster.

    Bulbo

  3. #3
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Citation Envoyé par bulbo
    Consulte la FAQ par exemple: ici

    Utilise un thread pour ta progress bar .. qqun avait sensiblement le meme probleme que toi ya pas 5min ..

    Merci de faire un minimum de recherche avant de poster.

    Bulbo
    Merci mai sj'ai déjà fait quelques recherche sur la FAQ et le forum,
    Merci de lire correctement les posts :

    Citation Envoyé par Regis.C
    même en mettant ma JProgressBar dans un Thread

  4. #4
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    J'ai peut etre ete un peu vite mais je suis surement pas le seul

    Ton traitement long tu le ferais pas dans le listener directement et pas dans un thread comme le recommande l'article de la FAQ que je t'ai passe.

    Si ton traitement long est execute dans le listener, il va bloquer le thread qui rafraichit ton interface. Tu vas avoir un freeze de ta GUI le temps de ton traitement.

    Relit conscieusement les deux articles de la FAQ je suis sur que tu vas trouver la solution dedans..

    Bulbo

  5. #5
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Ok merci pour ton aide Bulbo.

    Je vais essayer de revoir mon implémentation pour détecter le problème.

  6. #6
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    La mise à jour d'un composant Swing doit toujours se faire dans l'Event Dispatch Thread, ou EDT. Voici par exemple comment faire un traitement long qui met à jour une JProgressBar sans délai :

    // thread de traitement
    new Thread(new Runnable() {
    public void run() {
    final int counter = grosCalculsBienLourds();
    // invokeLater() place du code dans l'EDT
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    progressBar.setValue(counter);
    }
    });
    }
    }).start();

  7. #7
    Membre confirmé
    Avatar de Glob
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Avril 2002
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Avril 2002
    Messages : 428
    Points : 630
    Points
    630
    Par défaut
    Hello.
    Un peu de lecture au sujet des Threads et de Swing...

    http://java.sun.com/developer/JDCTechTips/2005/tt0419.html#1

    http://java.sun.com/developer/JDCTechTips/2005/tt0727.html#1

  8. #8
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Honnetement, j'ai tout essayé ce matin :

    mettre mon traitement lourd dans une methode du Thread dans lequel j'ai mis ma JProgressBar

    mettre ma JProgressBar dans un Thread, et mettre mon traitement dans un autre

    mettre mon traitement dans un Thread qui instancie un nouveau Thread pour la JProgressBar

    Utiliser le code fourni par Gfx

    Ben j'ai tellement modifié mon code qu'il ne ressemble à plus rien, et je ne suis pas plus avancé car ça ne marche toujours pas.

    Je crois que je vais me passer de JProgressBar moi!

  9. #9
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Bon, je n'arrive pas à abandonner...

    Désolé pour la quantité de code mais voila ma classe CoderProgressBarre que j'instancie à partir d'un JFrame.
    Le problème reste le même (alors que cette classe est directement chopé de l'exemple de la FAQ) ma JProgressBar n'apparait même pas (on voit juste une emplacement de la JFrame)tant que le traitement n'est pas fini, et lorsqu'il est fini ben elle dispose() (normal je lui demande)
    :

    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
    126
    127
    128
    129
    130
    131
     
     
     
     
    import java.io.IOException;
     
    import javax.swing.JFrame;
    import javax.swing.JProgressBar;
    import javax.swing.SwingUtilities;
     
     
    public class CoderProgressBarre extends JFrame implements Runnable
    {
    	public JProgressBar progress;
    	private boolean isStarted;
    	private int value;
    	public boolean workDone = false;
     
    	private String messageAcoder;
    	private String clePub;
    	private String clePriv;
     
    	public CoderProgressBarre (int yPos, int xPos, String mess, String cle1, String cle2)
    	{
    		super ("Veuillez patienter...");
    		messageAcoder = mess;
    		clePub = cle1;
    		clePriv = cle2;
     
     
     
    		this.isStarted = false;
    		this.value = 0;
    		this.progress = new JProgressBar (0, 100);
    		this.progress.setStringPainted (true);
    		this.getContentPane ().add (this.progress);
     
    		this.setDefaultCloseOperation (JFrame.DO_NOTHING_ON_CLOSE);
    		this.setLocation (yPos, xPos);
    		this.setSize(200,50);
    		this.setVisible (true);
    	}
     
     
    	// cree un nouveau Thread et appelle la methode start
    	// Cf une documentation sur les Thread si vous ne comprennez pas le
    	// mecanisme ....
    	public void lanceLongTraitement ()
    	{
    		Thread t = new Thread (this);
    		t.start ();
     
    		// maintenant nous rendons la main au processus d'evenement
    	}
     
    	// methode de l'interface Runnable
    	// lance un nouveau thread qui va executer le code de la methode longTraitement
    	public void run ()
    	{
     
    		this.longTraitement ();
    	}
     
     
    	public void longTraitement ()
    	{	// execute la succession d'operation ... 
    		// on est plus dans le processus d'evenement mais dans le nouveau Thread
     
    			this.uneOperation();
     
    			// maintenant on appelle la methode pour mettre a jour la barre
    			// de progression
    			this.majProgress (); 
     
    			this.dispose();
    	}
     
     
     
    	// methode qui effectue une pause pour simuler une operation
    	private synchronized void uneOperation ()
    	{
    		KeyCross k = new KeyCross();
    		String secretKey = k.KeyCrossing(clePub,clePriv);
     
     
    		Encoding encoding = new Encoding();
    		try 
    		{
    			encoding.read(messageAcoder);
    			encoding.codeLecture(clePub);
    			/**2eme passage dans la boucle de cryptage*/
    			encoding.read(Codage.getFuturFile());
    			encoding.codeLecture(clePriv);
    			/**3eme passage dans la boucle de cryptage*/
    			encoding.read(Codage.getFuturFile());
    			encoding.codeLecture(secretKey);
     
    		} 
    		catch (IOException e) 
    		{
    			e.printStackTrace();
    		}
    		workDone=true;
     
    	}
     
     
     
    	// methode qui met a jour la JProgressBar par le processus d'evenement
    	// Pourquoi obliger l'execution de cette methode par le processus d'evenement ?
    	// -> Cf : la docs du tutoriel de Sun section : "Threads and Swing"
    	// http://java.sun.com/docs/books/tutorial/uiswing/mini/threads.html
    	public void majProgress ()
    	{	if ( SwingUtilities.isEventDispatchThread () )
    		{	progress.setValue (++value);
    		}
    		else
    		{	Runnable callMAJ = new Runnable ()
    			{	public void run ()
    				{	majProgress ();
                    }
                };
                SwingUtilities.invokeLater (callMAJ);
    		}
    	}
     
     
     
     
    }
    Ce n'est pas comme ça qu'on implémente ???

  10. #10
    Membre régulier Avatar de spoutyoyo
    Inscrit en
    Avril 2004
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 116
    Points : 83
    Points
    83
    Par défaut
    J'ai eu également beaucoup de probléme pour faire un truc selon les posts et FAQ assez simple.

    Si tu vas sur ce lien http://www.developpez.net/forums/vie...769&highlight=
    tu pourras voir comment j'y est parvenu.

    De plus que certaines méthodes que j'avais testés, me provoquer avec des traitements longs des Out Of Memory aprés plusieurs lancement car à voir le thread était mal interrompu.

    J'espére t'avoir aidé.

  11. #11
    Membre averti
    Inscrit en
    Avril 2004
    Messages
    503
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 503
    Points : 445
    Points
    445
    Par défaut
    Merci mais j'ai capté (enfin!) comment cela tournait.
    Ok ça marche.

    Mais pas simple à utiliser si la boucle qui est la plu représentative de ton traitement est super profonde dans ton code !
    Donc ma progressBar s'implémente par 25%...car je ne peux pas acceder à la véritable boucle sans changer mon architecture.

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

Discussions similaires

  1. [XL-2010] Userform d'attente pendant traitement
    Par issoram dans le forum Macros et VBA Excel
    Réponses: 28
    Dernier message: 30/07/2013, 13h53
  2. Comment créer une barre d'attente pendant une requête
    Par darkspoilt dans le forum VBA Access
    Réponses: 8
    Dernier message: 14/08/2007, 09h18
  3. Message d'attente pendant traitement côté serveur
    Par bouliz dans le forum ASP.NET
    Réponses: 13
    Dernier message: 09/07/2007, 11h55
  4. [PHP-JS] Barre de chargement pendant traitement PHP
    Par Floweract dans le forum Langage
    Réponses: 4
    Dernier message: 11/10/2006, 15h16
  5. [Système] page d'attente pendant traitement system
    Par Squyrrel dans le forum Langage
    Réponses: 1
    Dernier message: 24/03/2006, 22h09

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