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

EDT/SwingWorker Java Discussion :

Souci avec SwingWorker et JProgressBar


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 42
    Par défaut Souci avec SwingWorker et JProgressBar
    hello,

    j'ai un souci pour mettre à jour une progressbar pendant un traitement long. J'ai essayé d'implémenter swingworker, j'ai l'impression d'avoir fait ce qu'il faut mais... ça ne marche pas ! Le traitement s'exécute, mais la barre n'est mise à jour qu'à la fin.
    Voilà quelques bouts de code :
    le swingworker :
    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
    public class CalculerDelaunay extends SwingWorker<Set<Triangle>, Integer>{
     
    	private List<Pnt> sommets ;
     
    	public CalculerDelaunay(List<Pnt> sommets) {
    		this.sommets = sommets;
    	}
     
    	@Override
    	protected Set<Triangle> doInBackground()  {
    		Triangulation t = new Triangulation(sommets);
    		int i = 0 ;
    		for (Pnt point : sommets ){
    			t.delaunayPlace(point);
    			setProgress((int) 100 *i/sommets.size());
    			System.out.println((int) 100 *i/sommets.size()+1);
    			i++;
    		}
    		return t.getListeTriangle().nodeSet() ;
    	}
     
    	protected void done() {
    		setProgress(100);
    	}
    }
    L'appel (situé dans un actionperformed d'un actionlistener):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CalculerDelaunay calc = new CalculerDelaunay(sommets);
    						calc.addPropertyChangeListener(new PropertyChangeProgressBar(fenetre.getProgressBar()));
    						calc.execute();
    et mon listener :
    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 PropertyChangeProgressBar implements PropertyChangeListener {
    	private JProgressBar progressBar ;
     
    	private PropertyChangeProgressBar(){
     
    	}
     
    	public PropertyChangeProgressBar(JProgressBar pB){
    		progressBar = pB ;
    	    progressBar.setValue(0);
    	}
    	@Override
    	public void propertyChange(PropertyChangeEvent evt) {
    		String strPropertyName = evt.getPropertyName();
    		System.out.println(strPropertyName);
    	    if ("progress".equals(strPropertyName)) {
    	      progressBar.setIndeterminate(false);
    	      int progress = (Integer)evt.getNewValue();
    	      progressBar.setValue(progress);
    	    }
    	}
    }
    Je ne vois pas bien d'où vient le problème... j'ai mis un syso dans mon listener, et il n'est appelé qu'à la fin !

    Quelqu'un a t'il une idée ? S'il faut que je place plus de code, pas de problème.

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Essaie d'enlever cet appel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    progressBar.setIndeterminate(false);
    de ton propertyChange

  3. #3
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 42
    Par défaut
    Bonjour,

    merci de la suggestion, mais ça ne change rien.

    à bientôt,

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu as combien d'élément dans ta liste ? Le traitement est-il rapide ?

    Il y a des chances que cela soit trop rapide pour voir la progression : le setProgress() n'engendre pas obligatoirement un évènement. En fait s'il y a plusieurs setProgress() "rapproché" dans le temps, seul le dernier sera pris en compte Sinon tu vas passer plus de temps à afficher la progression qu'à faire ton traitement.


    a++

  5. #5
    Membre averti
    Inscrit en
    Juillet 2004
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 42
    Par défaut
    hello,

    j'ai 3000 éléments dans la liste, donc effectivement chaque traitement est rapide, le traitement total dure une quinzaine de secondes. Le souci, c'est que je voudrais que mon traitement puisse fonctionner pour des listes 10 à 20 fois plus importantes, dois-je ne faire un setProgress que toutes les 10 ou 50 occurences du coup ?

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Niun Voir le message
    j'ai 3000 éléments dans la liste, donc effectivement chaque traitement est rapide, le traitement total dure une quinzaine de secondes.
    Sur une quinzaine de seconde tu devrais bien voir la progression pourtant !

    C'est bien le parcours de la liste qui prend ce temps ? Ou le constructeur de Triangulation ?

    Citation Envoyé par Niun Voir le message
    Le souci, c'est que je voudrais que mon traitement puisse fonctionner pour des listes 10 à 20 fois plus importantes, dois-je ne faire un setProgress que toutes les 10 ou 50 occurences du coup ?
    Justement non normalement tu n'as rien à faire : tu appels setProgress() régulièrement et ils seront automatiquement ignoré si trop rapproché. Cela s'adapte bien que le traitement soit rapide ou lent...


    Bizarre

    a++

Discussions similaires

  1. JProgressBar et Thread avec SwingWorker
    Par sebastien61 dans le forum EDT/SwingWorker
    Réponses: 5
    Dernier message: 13/05/2009, 17h08
  2. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 19h13
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 18h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 17h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 13h16

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