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 :

Problème d'affichage de progressBar


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 158
    Par défaut Problème d'affichage de progressBar
    Bonjour tout le monde, j'ai déjà réussit à utilisé une progressBar avec sucés, mais aujourd'hui, sur un autre développement (en reprenant l'ancien code), je ne comprend pas pourquoi elle ne s'affiche pas correctement.

    Voici mon problème, j'exécute une action longue représenté par l'interface ActionInterface, celui ci me dis quand l'action est finit et donc quand je dois arrêter ma barre de progression. J'exécute ma barre de progression dans un thread à pare. Au moment du déclanchement de l'action, mon thread propre à ma progressBar fonctionne bien, l'action se déroule bien, mais ma fenêtre ne s'affiche pas (enfin qu'a la fin de l'exécution). Donc j'aurais besoin d'un petit coup de pouce pour m'aider.

    Voici l'objet créé pour ma progressBar

    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
     
    public class ProgressBar implements Runnable {
    	private JWindow progressBarFrame; // Frame d'affichage de la barre de creation
    	protected ActionInterface action; // action en cours d'execution
    	private JProgressBar progressBar; // barre de progression
    	private Thread waitingThread; // thread permettant de gerer l'evolution de l'action
     
    	public ProgressBar(ActionInterface action)
    	{
    		this.action = action;
    		ProgressBarBox progressBarBox = new ProgressBarBox();
    		progressBar = progressBarBox.getProgressBar();
    		progressBarFrame = progressBarBox.getProgressBarFrame();
    		waitingThread= new Thread(this);
    		waitingThread.start();
    		action.launch();
    	}
     
    	public void run()
    	{
    		int countProgress = 0;
    		while (!action.getActionStatus()) {
    			if (countProgress >= 100) countProgress = 0;
    			else countProgress=countProgress+1;
    			progressBar.setValue(countProgress);
    			try {waitingThread.sleep(20);}
    			catch(Exception e){}
    		}
    		progressBarFrame.dispose();
    	}
     
    	private class ProgressBarBox {
    		private int scale = 100; // echelle de la barre de progression
    		private JWindow progressBarFrame; // fenetre de la barre de progression
    		private JProgressBar progressBar; // la barre de progression
     
    		private ProgressBarBox()
    		{
    			progressBarFrame = new JWindow();
    			JPanel panelProgressBar = new JPanel();
    			JLabel texte = new JLabel("Please wait, process in progress");
    			progressBar = new JProgressBar(0, scale);
    			panelProgressBar.add("Center", progressBar);
    			panelProgressBar.add("Center", texte);
    			progressBarFrame.getContentPane().add(BorderLayout.CENTER, panelProgressBar);
    			progressBarFrame.setSize(275,85);
    			progressBarFrame.setVisible(true);
    		}
     
    		private JWindow getProgressBarFrame() {return progressBarFrame;}
     
    		private JProgressBar getProgressBar() {return progressBar;}
    	}
    }
    Si quelqu'un sait ou j'ai faux? J'ai l'impression que c'est un problème lors de la création du frame affichant la barre de progression.

  2. #2
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par iviath Voir le message
    J'exécute ma barre de progression dans un thread à pare. Au moment du déclanchement de l'action, mon thread propre à ma progressBar fonctionne bien, l'action se déroule bien, mais ma fenêtre ne s'affiche pas (enfin qu'a la fin de l'exécution).
    Ton code fonctionne bien chez moi, je n'y vois pas d'erreurs:
    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
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
     
    public class ProgressBar implements Runnable {
    	private JWindow progressBarFrame; // Frame d'affichage de la barre de creation
    	protected ActionInterface action; // action en cours d'execution
    	private JProgressBar progressBar; // barre de progression
    	private Thread waitingThread; // thread permettant de gerer l'evolution de l'action
     
    	public ProgressBar(ActionInterface action)
    	{
    		this.action = action;
    		ProgressBarBox progressBarBox = new ProgressBarBox();
    		progressBar = progressBarBox.getProgressBar();
    		progressBarFrame = progressBarBox.getProgressBarFrame();
    		waitingThread= new Thread(this);
    		waitingThread.start();
    		action.launch();
    	}
     
    	public void run()
    	{
    		int countProgress = 0;
    		while (!action.getActionStatus()) {
    			if (countProgress >= 100) countProgress = 0;
    			else countProgress=countProgress+1;
    			progressBar.setValue(countProgress);
    			try {waitingThread.sleep(20);}
    			catch(Exception e){}
    		}
    		progressBarFrame.dispose();
    	}
     
    	private class ProgressBarBox {
    		private int scale = 100; // echelle de la barre de progression
    		private JWindow progressBarFrame; // fenetre de la barre de progression
    		private JProgressBar progressBar; // la barre de progression
     
    		private ProgressBarBox()
    		{
    			progressBarFrame = new JWindow();
    			JPanel panelProgressBar = new JPanel();
    			JLabel texte = new JLabel("Please wait, process in progress");
    			progressBar = new JProgressBar(0, scale);
    			panelProgressBar.add("Center", progressBar);
    			panelProgressBar.add("Center", texte);
    			progressBarFrame.getContentPane().add(BorderLayout.CENTER, panelProgressBar);
    			progressBarFrame.setSize(275,85);
    			progressBarFrame.setVisible(true);
    		}
     
    		private JWindow getProgressBarFrame() {return progressBarFrame;}
     
    		private JProgressBar getProgressBar() {return progressBar;}
    	}
     
            public static void main(String... args) {
                Runnable gui = new Runnable() {
     
                    public void run() {
                        JFrame f = new JFrame();
                        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                        f.setSize(400, 300);
                        JButton btStart = new JButton("Start");
                        f.add(btStart, BorderLayout.NORTH);
                        btStart.addActionListener(new ActionListener() {
     
                            public void actionPerformed(ActionEvent e) {
                                ProgressBar progressBar1 = new ProgressBar(new ActionInterface());
                            }
                        });
                        f.setVisible(true);
                    }
                };
                //GUI must start on EventDispatchThread:
                SwingUtilities.invokeLater(gui);
            }
    }
    class ActionInterface implements Runnable {
     
        private boolean actionStatus;
     
        public void launch() {
            new Thread(this).start();
        }
     
        boolean getActionStatus() {
            return actionStatus;
        }
     
        public void run() {
            for (int i = 0; i < 100; i++) {
                try {
                    Thread.sleep(20);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
            actionStatus = true;
        }
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 158
    Par défaut
    J'ai l'impression que c'est un problème de rafraichissement, peut être que le bug est plus haut, car il ne m'affiche ma fenêtre que quand un autre popup est affiché.

  4. #4
    Membre expérimenté Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Par défaut
    Citation Envoyé par iviath Voir le message
    peut être que le bug est plus haut
    Dans ce cas il faudrait nous montrer le code "plus haut". Tu feras de préférence un court exemple indépendant et compilable comme je l'ai fait également.

    EDIT: Comme l'explique le commentaire ci-après, il faut également appeler "setValue" sur le "EventDispatchThread". Tu peux le faire par "invokeLater", "invokeAndWait" ou en utilisant "SwingWorker":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    final int count = countProgress;
    Runnable setValue = new Runnable() {
        public void run() {
            progressBar.setValue(count);
        }
    };
    SwingUtilities.invokeLater(setValue);

  5. #5
    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 utilises un thread qui lit le status d'une action, qui qui met à jour le JProgressBar... c'est incorrect puisque les mises à jours du ProgressBar DOIVENT se faire dans l'EDT...

    Il serait préférable d'utiliser un SwingWorker pour le traitement, et de lui associer un listener pour incrémenter la progressbar...

    a++

Discussions similaires

  1. Problème d'affichage ProgressBar dans un TreeViewer
    Par maxi297 dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 22/07/2012, 21h29
  2. Réponses: 2
    Dernier message: 07/08/2010, 22h34
  3. [Toutes versions] Problème d'affichage Form de type ProgressBar
    Par Duke_MBA dans le forum IHM
    Réponses: 1
    Dernier message: 11/08/2009, 15h00
  4. Problème d'affichage Progressbar
    Par Ricardo01 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 12/06/2009, 13h33
  5. probléme d'affichage d'une fiche
    Par sb dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 09h43

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