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 avec une progress bar


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 64
    Points : 42
    Points
    42
    Par défaut problème avec une progress bar
    Bonjour,

    j'essaie depuis quelques jours maintenant de faire apparaître une jframe au clic d'un bouton dans laquelle s'affiche une progressbar pour faire patienter l'utilisateur, le temps de l'exécution d'une requete et de l'affichage de la "page" suivante.

    j'affiche bien la jframe mais la progress bar à l'intérieur s'affiche qu'une fois l'execution de la requete et l'affichage fait et elle se charge...

    j'ai lu plein de chose, mais j'ai du mal à comprendre l'utilisation de l'EDT et de SwingWorker...

    voici ma classe pour la progress bar :

    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
    package interfac;
     
    import java.awt.*;
    import javax.swing.*;
     
    public class progression {
     
        JProgressBar progress;
        Thread monThread;
        int rappidite;
        JFrame cadre;
     
        public void go(int rappid) {
            rappidite = rappid;
            // Création de l'interface
            cadre = new JFrame("En cours de chargement");
            JPanel panneau = new JPanel();
            progress = new JProgressBar(0, 100);
            panneau.add("Center", progress);
            cadre.getContentPane().add(BorderLayout.CENTER, panneau);
            cadre.setSize(275, 85);
            java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
            cadre.setLocation(
                    (screenSize.width - cadre.getWidth()) / 2,
                    (screenSize.height - cadre.getHeight()) / 2);
            cadre.setVisible(true);
            cadre.setResizable(false);
            cadre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // Création de thread
            monThread = new Thread(new MonRunnable());
            monThread.start();
     
        }
     
        public class MonRunnable implements Runnable {
     
            public void run() {
                for (int j = 1; j < 100; j++) // on fait une boucle pour que la JProgressBar "avance"
                {
                    progress.setValue(j);
                    try {
                        Thread.sleep(rappidite);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                cadre.dispose(); //on ferme le cadre (le chergement est fini!)
     
            }
        }
    }
    et le morceaux de code que j'execute au début de l'actionperfomed de mon button
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private void jButtonConectarseConnectionActionPerformed(java.awt.event.ActionEvent evt) {                                                            
        //connecter l'utilisateur
        progression progress = new progression();
        progress.go(12);
    merci pour votre aide qui sera surement d'un grand secours !

  2. #2
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Plusieurs petites choses:

    Pour centrer ta JFrame au milieu de ton écran pas besoin de tout calculer toi même. Tu peu te contenter d'un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cadre.setLocationRelativeTo(null); // window center

    En général on affiche la frame une fois qu'elle est configurée donc après les instructions comme setResizable ou setDefaultCloseOperation.

    D'ailleurs, il est étonnant de quitter l'application si on ferme la fenêtre d'attente. Ceci dit, pourquoi utiliser une frame pour faire attendre et pas plutôt simplement une boite de dialogue modale ?

    Pour le reste je n'ai pas vu le code où tu lance ta requête donc il est difficile de se prononcer.

    Sinon, je vais en profiter pour me faire un poil de pub, mais tu peu regarder du coté de JBusyComponent afin de rendre inactif un composant le temps d'un traitement tout en affichant son suivi (barre de progression).

  3. #3
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 64
    Points : 42
    Points
    42
    Par défaut
    quelques petites corrections proposés sur la classe :
    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
     
    public class progression {
     
        JProgressBar progress;
        Thread monThread;
        int rappidite;
        JFrame cadre;
     
        public void go(int rappid) {
            rappidite = rappid;
            // Création de l'interface
            cadre = new JFrame("En cours de chargement");
            JPanel panneau = new JPanel();
            progress = new JProgressBar(0, 100);
            panneau.add("Center", progress);
            cadre.getContentPane().add(BorderLayout.CENTER, panneau);
            cadre.setSize(275, 85);
            cadre.setLocationRelativeTo(null);
            cadre.setVisible(true);
            cadre.setResizable(false);
            // Création de thread
            monThread = new Thread(new MonRunnable());
            monThread.start();
     
        }
     
        public class MonRunnable implements Runnable {
     
            public void run() {
                for (int j = 1; j < 100; j++) // on fait une boucle pour que la JProgressBar "avance"
                {
                    progress.setValue(j);
                    try {
                        Thread.sleep(rappidite);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                cadre.dispose(); //on ferme le cadre (le chargement est fini!)
     
            }
        }
    }
    et tout le code de mon action perfomed du button

    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
     
    private void jButtonConectarseConnectionActionPerformed(java.awt.event.ActionEvent evt) {                                                            
        //connecter l'utilisateur
        progression progress = new progression();
        progress.go(12);
        //on crée un utilisateur vierge
        Usuario u_tmp = new Usuario();
        //on enregistre le login 
        u_tmp.setLogin(this.jTextFieldUsuarioConnection.getText());
        //on enregistre le mot de passe
        char[] n = this.jPasswordFieldContrasenaConnection.getPassword();
        int i = n.length;
        String pwd = "";
        for(int j = 0; j<i; j++){
            pwd +=n[j];
        }
     
        u_tmp.setContrasena(pwd);
        try {
            //on connecte l'utilisateur si c'est bon
            //sinon on l'averti de son erreur et on vide les champs
            if (u_tmp.connectarse()) {
                //on enregistre l'utilisateur temporaire dans l'utilisateur normal
                a_template.u = new Usuario(u_tmp.getId());
                //on passe à la page suivante en fonction du type de l'utilisateur
                CardLayout c = (CardLayout) conteneur.getLayout();
                switch (a_template.u.getType()) {
                    case Medecin:
                        //page recherche d'un élève
                        jPanelFondBleuConnection.setVisible(false);
                        conteneur.add(new ba_rchhAlumno(conteneur), "");
                        c.show(conteneur, "");
                        //prog.dispose();
                        break;
     
                    case Admin:
                        jPanelFondBleuConnection.setVisible(false);
                        conteneur.add(new ca_administrateur(conteneur), "");
                        c.show(conteneur, "");
                        //prog.dispose();
                        break;
                }
            } else {
                this.jTextFieldUsuarioConnection.setText("");
                this.jLabelTextIndicConnection.setText("Su login o su contraseña esta incorrecto. Intenta otra vez.");
                this.jPasswordFieldContrasenaConnection.setText("");
                //prog.dispose();
            }
        } catch (ClassNotFoundException ex) {                                                           
         Logger.getLogger(b_connection.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(b_connection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

  4. #4
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    tout ton traitement effectué au sein de jButtonConectarseConnectionActionPerformed se fait dans l'EDT (le thread graphique).

    Donc quand ton thread change la valeur de la progress bar, des evenement de "réaffichage" s'empile dans la queue de l'EDT mais ne peuvent pas être traités avant que l'EDT ai fini ce qu'il est en train de faire (c'est à dire terminer l'execution de ta méthode jButtonConectarseConnectionActionPerformed).

  5. #5
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 64
    Points : 42
    Points
    42
    Par défaut
    c'est ce que j'ai lu

    mais j'arrive pas à comprendre comment faire pour le sortir de là et le faire en parallèle...

    (les jbusycomponent ont l'air pas mal)

  6. #6
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Dans l'idéal c'est à ton traitement de notifier des changements de "progression" et non à un thread indépendant qui change la valeur de façon arbitraire.

    Mais j'ai le sentiment que dans ton cas, tu ne sais pas vraiment indiquer où tu en est exactement de ta connection.

    C'est pourquoi je te proposerais bien de partir comme suit:
    - Rendre la JProgressBar indeterminée ==> setIndeterminate
    - De supprimer ton thread lancé par ta classe progression
    - De modifier ta méthode jButtonConectarseConnectionActionPerformed afin d' ouvrir ta frame d'attente et d'executer le reste dans un autre Thread.
    - Modifier la fin de ton traitement à la fin de la connection pour fermer ta Frame d'attente.

    PS: merci pour ta remarque sur JBusyComponent.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 64
    Points : 42
    Points
    42
    Par défaut
    avec le code suivant, la frame s'affiche au bon moment avec la bar à l'intérieur mais celle ci ne progresse pas...la frame se ferme au bon moment

    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
     
    private void jButtonConectarseConnectionActionPerformed(java.awt.event.ActionEvent evt) {
        //connecter l'utilisateur
        final progression progress = new progression();
        progress.go();
     
        Thread monThread = new Thread(new Runnable() {
     
            public void run() {
                seconnecter();
                progress.end();
            }
        });
        monThread.start();
     
    }
    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
     
    public class progression {
     
        JProgressBar progress;
        Thread monThread;
        int rappidite;
        JFrame cadre;
     
        public void go() {
           // rappidite = rappid;
            progress = new JProgressBar();
            progress.setIndeterminate(true);
            // Création de l'interface
            cadre = new JFrame("En cours de chargement");
            JPanel panneau = new JPanel();
            progress = new JProgressBar(0, 100);
            panneau.add("Center", progress);
            cadre.getContentPane().add(BorderLayout.CENTER, panneau);
            cadre.setSize(275, 85);
            cadre.setLocationRelativeTo(null);
            cadre.setVisible(true);
            cadre.setResizable(false);
     
     
        }
     
        public void end(){
            cadre.dispose();
        }
    Merci de m'aider,
    c'est la première fois que je fais ce genre de manipulation donc c'est un peu laborieux :s

  8. #8
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 64
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par Espinosa Voir le message
    avec le code suivant, la frame s'affiche au bon moment avec la bar à l'intérieur mais celle ci ne progresse pas...la frame se ferme au bon moment

    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
     
    private void jButtonConectarseConnectionActionPerformed(java.awt.event.ActionEvent evt) {
        //connecter l'utilisateur
        final progression progress = new progression();
        progress.go();
     
        Thread monThread = new Thread(new Runnable() {
     
            public void run() {
                seconnecter();
                progress.end();
            }
        });
        monThread.start();
     
    }
    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
     
    public class progression {
     
        JProgressBar progress;
        Thread monThread;
        int rappidite;
        JFrame cadre;
     
        public void go() {
           // rappidite = rappid;
            progress = new JProgressBar();
            progress.setIndeterminate(true);
            // Création de l'interface
            cadre = new JFrame("En cours de chargement");
            JPanel panneau = new JPanel();
            progress = new JProgressBar(0, 100);
            panneau.add("Center", progress);
            cadre.getContentPane().add(BorderLayout.CENTER, panneau);
            cadre.setSize(275, 85);
            cadre.setLocationRelativeTo(null);
            cadre.setVisible(true);
            cadre.setResizable(false);
     
     
        }
     
        public void end(){
            cadre.dispose();
        }
    Merci de m'aider,
    c'est la première fois que je fais ce genre de manipulation donc c'est un peu laborieux :s
    j'ai changer de place le setindeterminate
    ça marche!
    mais j'ai une erreur ...

    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at javax.swing.plaf.basic.BasicProgressBarUI.updateSizes(BasicProgressBarUI.java:470)
    at javax.swing.plaf.basic.BasicProgressBarUI.getBox(BasicProgressBarUI.java:427)
    at javax.swing.plaf.basic.BasicProgressBarUI.paintIndeterminate(BasicProgressBarUI.java:582)
    at javax.swing.plaf.metal.MetalProgressBarUI.paintIndeterminate(MetalProgressBarUI.java:126)
    at javax.swing.plaf.basic.BasicProgressBarUI.paint(BasicProgressBarUI.java:392)
    at javax.swing.plaf.ComponentUI.update(ComponentUI.java:143)
    at javax.swing.JComponent.paintComponent(JComponent.java:763)
    at javax.swing.JComponent.paint(JComponent.java:1027)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paint(JComponent.java:1036)
    at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
    at javax.swing.JComponent.paintChildren(JComponent.java:864)
    at javax.swing.JComponent.paintToOffscreen(JComponent.java:5129)
    at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:285)
    at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
    at javax.swing.JComponent.paint(JComponent.java:1013)
    at java.awt.GraphicsCallback$PaintCallback.run(GraphicsCallback.java:21)
    at sun.awt.SunGraphicsCallback.runOneComponent(SunGraphicsCallback.java:60)
    at sun.awt.SunGraphicsCallback.runComponents(SunGraphicsCallback.java:97)
    at java.awt.Container.paint(Container.java:1797)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:734)
    at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
    at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
    at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

  9. #9
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Dans le code que tu donnes, tu instancies 2 JProgressBar et une seule est ajoutée à ta frame. Supprime l'instanciation qui ne te sert pas. (la 1ere a priori). Et place le setUndeterminate sur la seule instance que tu gardes.

  10. #10
    Membre du Club
    Inscrit en
    Juin 2009
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 64
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par divxdede Voir le message
    Dans le code que tu donnes, tu instancies 2 JProgressBar et une seule est ajoutée à ta frame. Supprime l'instanciation qui ne te sert pas. (la 1ere a priori). Et place le setUndeterminate sur la seule instance que tu gardes.
    a ouais ! lol

    je dois commencer à fatiguer !

    Grand merci en tout cas !
    ça marche ! tu m'as enlevé une belle épine du pied!!!

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

Discussions similaires

  1. [Débutant] Convertir des fichier HTML en image (jpeg,png et gif) avec une progress bar
    Par hsoussi dans le forum Développement Windows
    Réponses: 4
    Dernier message: 07/04/2014, 12h35
  2. Problèmes avec une barre de progression
    Par brbtx dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 19/12/2013, 16h48
  3. utilisation d'une progress bar avec un timer
    Par devock dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 22/12/2006, 12h57
  4. Problème avec une Barre de Progression
    Par hugo69 dans le forum Access
    Réponses: 1
    Dernier message: 15/12/2006, 15h37
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33

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