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 :

Problème de progressbar


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 89
    Points : 60
    Points
    60
    Par défaut Problème de progressbar
    Bonjour,

    Je suis en train de réaliser une petite interface simple avec un bouton, celle-ci va lancer une requête sur un serveur et ensuite récupérer le retours de la pages (pas obligatoire).
    En fait je bloque pour faire attendre l'utilisateur pendant que le traitement tourne. J'ai essayé avec un progressbar mais en fait une fois que l'on clique sur le bouton l'appli ce fige... Je pense que je m'y prend mal avec le code, mais je n'arrive pas a voir comment faire. Au départ je pensais juste faire une boucle qui fait bouger la progressbar mais l'appli bloque et une fois la requête exécuté, la progressbar ce remplit

    Je vous remercie d'avance pour votre aide

    Voici le code du 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
    int i =0;
       jProgressBar1.setValue(50); // C'est un test pour voir si la progressbar voulais bien se remplir
          try 
        {
          String adress = "http://ipserveur/job3";      
          URL url = new URL(adress);       
          URLConnection yc = url.openConnection();     
          String answer = "", temp = "";      
          BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));     
          while ((temp = in.readLine()) != null){
            answer = answer + temp;        
          }
          in.close();
          System.out.println(answer);
        }
        catch (Exception e)
        {
          e.printStackTrace();
        }

  2. #2
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2014
    Messages : 131
    Points : 93
    Points
    93
    Par défaut
    Bonjour arttom;
    j'ai pas bien compris ton problème mais normalement vous devez travailler avec les thread ,je te donne un code qui utilise le jprogressbar avec les thread pour contrôler le coté dynamique
    vous mettez sa hors du constructeur pour que le tout utilise sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public Thread t;
     public JProgressBar progressBar = new JProgressBar();
    ensuite dans ton constructeur vous devez caractérisé ton jbrogressbar selon vos besoin(la couleur ,la taille..).
    voici un exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    progressBar.setFont(new Font("Tahoma", Font.BOLD, 12));
    			progressBar.setStringPainted(true);
    			progressBar.setToolTipText("fgds");
    			progressBar.setBackground(new Color(245, 245, 245));
    			progressBar.setForeground(new Color(255, 0, 255));
     
    			progressBar.setBounds(30, 357, 378, 15);
    //n’oubliè pas de rajouter le progressbar à ton panneau
    et normalement en ajoutant cette ensemble d'instructions dans n’importe quel endroit sa dépend ton problème pour faire appel à la classe traitement a fin de lancer le jprogressbar (si tu veux vous pouvez le mettre dans le constructeur de ta fenêtre pour que le jbprogressbar se lance directement ).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	t = new Thread(new Traitement());
    			t.start();
    voici la calsse traitement que j’étais entraine de vous parler .
    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
     
    		class Traitement implements Runnable{
    			public void run(){
    			/*launch.setEnabled(false);*/
    			for(int val = 0; val <= 500; val++){
    				progressBar.setValue(val);
    			try {
    			t.sleep(200);
    			} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    			}
    			}
    			}
    			}
    bon courage et j'espère que tu a une idée .

  3. #3
    Membre du Club
    Homme Profil pro
    Etudiant
    Inscrit en
    Décembre 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 89
    Points : 60
    Points
    60
    Par défaut
    Merci beaucoup pour la réponse complète !!!

    Maintenant oui j'ai une bonne idée de la chose, j'avais commencé à regarder les thread et ca correspond exactement à mon besoin.

    En tout cas merci

  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
    Salut,

    La classe SwingWorker est prévu pour gérer ce genre de cas, sans avoir à se préoccuper de l'aspect technique (donc de l'aspect thread en particulier).

    Voir :



    Avec éventuellement, si plus d'affinités : Better Swingworker
    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
    Etudiant
    Inscrit en
    Décembre 2012
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Etudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 89
    Points : 60
    Points
    60
    Par défaut
    Merci,

    Je me penche dessus cet après midi

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    +1 avec ce qui a été dit : il faut éviter tout traitement lourd dans le thread graphique.
    Ce dernier ne devrait servir qu'à mettre à jour l'affichage. Les traitements longs doivent être fait dans un thread différent...


    Mais je reviens sur un bout de code qui m'a fait tiquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          String answer = "", temp = "";
          BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));     
          while ((temp = in.readLine()) != null){
            answer = answer + temp;        
          }
          in.close();
    C'est bien d'appeler close(), mais il faut le faire proprement.
    Soit via un try/finally (Java 6 et inférieur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));     
          try {
          // ...
          } finally {
                in.close();
          }
    Soit plus directement via le try-with-ressource (Java 7 et supérieur) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          try (BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()))) {
                // ...
          }
    Cela peut paraitre anodin, mais cela permet de libérer la ressource même en cas d'erreur pendant la lecture.
    Si l'application a une durée de vie un tant soit peu conséquente cela peut devenir critique...




    Le deuxième point concerne la lecture via BufferedReader + concaténation de String.
    Les String ne sont pas faite pour cela, et ce code engendre la création d'un grand nombre d'objet temporaire très couteux.
    Il faut passer par un StringBuilder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          StringBuilder sb = new StringBuilder();
          try (BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()))) {
                String temp;
                while ((temp = in.readLine()) != null){
                      sb.append(temp);  
                }   
          }
          String answer = sb.toString();
    Au passage readLine() supprime les fins de ligne. Si c'est bien ce que tu veux c'est ok, sinon autant utiliser son propre buffer de lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          StringBuilder sb = new StringBuilder();
          try (Reader in = new InputStreamReader(yc.getInputStream())) {
                char[] cbuf = new char[8192];
                int len;
                while ((len= in.read(cbuf)) > 0){
                      sb.append(cbuf, 0, len);  
                }   
          }
          String answer = sb.toString();


    a++

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

Discussions similaires

  1. Problème de ProgressBar dans une dll
    Par terminator59140 dans le forum C#
    Réponses: 6
    Dernier message: 02/06/2008, 20h26
  2. [C#] ProgressBar: Problème Valeur maximum
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/05/2006, 19h23
  3. Problème avec une progressBar
    Par kurul1 dans le forum C++Builder
    Réponses: 13
    Dernier message: 29/03/2006, 11h29
  4. Réponses: 5
    Dernier message: 10/05/2005, 11h22
  5. [C#] - Problème ProgressBar et Process ?
    Par clemc dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/06/2004, 11h45

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