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 :

[JProgressBar]Problème de thread


Sujet :

EDT/SwingWorker Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut [JProgressBar]Problème de thread
    Bonjour à tous,

    Je débute en SWING et j'ai vraiment du mal à gérer les threads avec SWING. Voilà mon problème : J'ai un bouton dans une fenêtre (JFrame) auquel est associée la classe ImageAction (qui étend AbstractAction), dans la méthode actionPerformed(), j'ai une boucle for qui lit un certain nombre de fichiers. J'aimerais que au fur et à mesure de l'avancement de la boucle for, une barre de progression avance.

    J'ai pour l'instant une classe ProgressBar qui crée une nouvelle JFrame qui contient cette ProgressBar. Je l'instancie dans actionPerformed() juste avant d'entrer dans la boucle. Au fur et à mesure du for, je fais des progressBar.setValue(...). Biensur, ça ne peut pas marcher comme ça, j'ai essayé diverses choses avec SwingUtilities.invokeLater comme on peut lire un peu partout sur Internet mais y'a rien à faire, ça ne marche pas en même temps de l'avancement de la boucle.

    Quelqu'un pourrait me mettre sur la voie pour y arriver ?

    Merci d'avance,

    Benjamin

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Même problèmes avec ProgressMonitor, voilà à peu près l'état de ma méthode actionPerformed() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
        ProgressMonitor progressMonitor = new ProgressMonitor(window, "Test", "test", 0, 100);
        int progress;
     
        for (int i = 0; i < numFiles; i++) {
            progress = ...;
            ...
            progressMonitor.setProgress(progress);
          }
        }
    ...
    Rien à faire, il n'y a rien qui ne se fait en même temps .

  3. #3
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    La progression de ta JProgressbar, par l'utilisation de la méthode setValue(...) doit être faite dans l'EDT, sinon la barre ne se remplit pas au fur et à mesure des setValue, mais tout à la fin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SwingUtilities.invokeLater(new Runnable() {
    	@Override
    	public void run() {
    		progressBar.setvalue(value);
    	}
    });
    Tu as des tuto sur le site de Sun, y compris ProgressMonitor, ici

  4. #4
    Membre éclairé Avatar de donnadieujulien
    Développeur informatique
    Inscrit en
    Avril 2008
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2008
    Messages : 433
    Par défaut Yo
    Normalement faut pas utiliser de thread avec SWING, ce que te diront certains...
    Mais bon...
    JE te donne le code dont je me sert qui marche très bien :

    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
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    package bars;
     
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Font;
    import javax.swing.BorderFactory;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JProgressBar;
    import javax.swing.SwingConstants;
     
    import labels.teinte_label;
     
    import simple_class.datas;
    import alerts.alerte_mod2;
    import simple_class.generate_data;
     
    public class generate_bar_mod extends JDialog {
     
        private static final long serialVersionUID = -195343032321139627L;
     
        private JPanel jContentPane = null;
     
        private JProgressBar progress = null;
     
        private Move move = null;  //  @jve:decl-index=0:
     
       private int i;
     
        private alerte_mod2 am2 = null; 
     
       private generate_data gd = new generate_data();  //  @jve:decl-index=0:
     
       private teinte_label tl = null;
     
        public generate_bar_mod(JFrame owner) {
            super(owner, "Veuillez Patienter...", false);
            initialize();
            setLocationRelativeTo(owner);
        }
     
        public void end_and_dispose() {
        	tl.timer.stop();
        	tl.timer = null;
            this.dispose();
        }
     
        private void initialize() {
     
            this.setModal(true);
            this.setSize(new Dimension(400, 60));
            this.setContentPane(getJContentPane());
            this.setUndecorated(true);
            if (move == null) {
                move = new Move();
                move.start();
            }
        }
     
        private JPanel getJContentPane() {
            if (jContentPane == null) {
                tl = new teinte_label();
                tl.setHorizontalTextPosition(SwingConstants.CENTER);
                tl.setFont(new Font("Dialog", Font.BOLD, 14));
                tl.setHorizontalAlignment(SwingConstants.CENTER);
                jContentPane = new JPanel();
                jContentPane.setBorder(BorderFactory.createEtchedBorder(Color.GRAY,
                Color.DARK_GRAY));
                jContentPane.setLayout(new BorderLayout());
                jContentPane.add(getProgress(), java.awt.BorderLayout.CENTER);
                jContentPane.add(tl, java.awt.BorderLayout.NORTH);
                setAlert_Mod2();
            }
            return jContentPane;
        }
     
        private void setAlert_Mod2(){
    		if(am2 == null){
    			am2 = new alerte_mod2(this);
    		}
    	}
     
        private JProgressBar getProgress() {
            if (progress == null) {
                progress = new JProgressBar();
                progress.setMinimum(0);
                progress.setValue(0);
            }
            return progress;
        }
     
        private class Move extends Thread {
            public void run() {
            	try{
            		progress.setValue(0);
            		String msg = "Génération des objets...";
            		tl.setText(msg);
            		progress.setMaximum(4999);
            		i = 0;
            		while(i<5000){
            			gd.generate_objets();
     
            			try{
            				sleep(1);
            			}
            			catch(Exception e){
            				System.out.println(e.toString());
            				end_and_dispose();
            			}
            			i++;
            			msg = "Génération des objets(Change N°" + datas.current_numero_change + ")...";
            			tl.setText(msg);
            			getProgress().setValue(i);
            			repaint();
            		}
     
            		progress.setValue(0);
            		msg = "Génération des câbles...";
            		tl.setText(msg);
            		progress.setMaximum(gd.position_depart_list.size() - 1);
            		i =0;
            		while(i<gd.position_depart_list.size()){
            			gd.generate_cables(i);
            			try{
            				sleep(1);
            			}
            			catch(Exception e){
            				System.out.println(e.toString());
            				end_and_dispose();
            			}
            			i++;
            			msg = "Génération des câbles(Change N°" + datas.current_numero_change + ")...";
            			tl.setText(msg);
            			getProgress().setValue(i);
            			repaint();
            		}
            		end_and_dispose();
            	}
            	catch(Exception e){
            		System.out.println(e.toString());
            		end_and_dispose();
            	}
            }
        }
    }

    Normalement, ca marche très bien
    En espérant t'avoir aidé

Discussions similaires

  1. Problème de Thread et JProgressBar
    Par ptitdje dans le forum Général Java
    Réponses: 4
    Dernier message: 14/06/2012, 10h29
  2. [VB.NET] Problème de Thread
    Par Sadneth dans le forum ASP.NET
    Réponses: 26
    Dernier message: 31/01/2006, 10h12
  3. Problème synchronisation threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 19
    Dernier message: 11/01/2006, 16h57
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51
  5. [VC++6][DX9] Problème de thread lors d'un blit ...
    Par grandjouff dans le forum DirectX
    Réponses: 2
    Dernier message: 12/06/2003, 22h22

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