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

avec Java Discussion :

recursivite et progression bar


Sujet :

avec Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 25
    Points
    25
    Par défaut recursivite et progression bar
    Novice en Java. Voici mon problème : Je scanne mon disque à la recherche d'un .jpg. j'aimerai afficher les fichiers parcouru en meme temps dans ma progressionBar (histoire de se dire tiens ca bosse!) mais je crois avoir un probleme de pile : ma methode scan etant recursive... ma progression bar reste innerte elle ne recoit pas les noms des fichiers...

    j'imagine qu'il faudrait cree des Thread different.. mais je ne sais pas comment faire si c'est un thread par recursion ou juste pour le progressbar ou je ne sais pas je suis en panne seche Merci a tous.

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Donne ton code.
    La mise à jour de la progressBar doit se faire dans l'EDT, le thread unique de la gestion graphique.
    Par contre, ton traitement ne doit pas se faire dans l'EDT, sinon tu bloques l'interface graphique.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 25
    Points
    25
    Par défaut voici le code
    la class progression avec :
    avec le main ca marche sans probleme.
    mais dans mon programme Extrait du scan ca ne mache plus
    bon j'avous ne pas encore bien comprendre comment transmettre des infos entre class non parent -> enfant prochaine question. lol

    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
     
    import java.awt.*; 
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.*; 
     
    public class progression implements ActionListener {
    	// Variables
    	public boolean annulation = false;
     
    	// Graphics
    	JFrame cadre;
    	JPanel panneau1 = new JPanel();
    	JPanel panneau2 = new JPanel();
    	JLabel texte = new JLabel("");
    	JProgressBar progress = new JProgressBar(0, 100);
    	JButton boutonAnnuleCopie =  new JButton("Annuler");
     
     
    	public progression(){
    		cadre = new JFrame("Progression Copie");
     
    		panneau1.add(progress, BorderLayout.CENTER);
    		panneau2.add(texte, BorderLayout.SOUTH);
     
    		cadre.getContentPane().add(BorderLayout.NORTH, panneau1);
    		cadre.getContentPane().add(BorderLayout.CENTER, panneau2);
    		cadre.setSize(250,120);
    		cadre.setResizable(false);
     
    		JPanel Annulation_Copie = new JPanel();
    		Annulation_Copie.add(boutonAnnuleCopie); 	
    		cadre.add(Annulation_Copie, BorderLayout.SOUTH);
     
    		boutonAnnuleCopie.addActionListener(this);
     
    		cadre.setLocationRelativeTo(null);
    		cadre.setVisible(true);
    		cadre.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    	}
     
     
    	public void actionPerformed(ActionEvent arg0) {
    		if(arg0.getSource() == boutonAnnuleCopie){
    			annulation = true;
    			cadre.setVisible(false);
    		}
     
    	}
    }
    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
    import java.awt.event.*;
     
     
    public class main {
     
     
     
    	public static void main(String[] args) {
    		progression prgs= new progression();
     
    		// on fait une boucle pour que la JProgressBar "avance"
    		for (int j = 1; j < 100; j++) {
     
     
    			prgs.progress.setValue(j);
    			prgs.cadre.setVisible(true);
     
    			if (j<50){
    				prgs.texte.setText("to");
    			}
    			else{
    				prgs.texte.setText("totajhfkjgfkjgfk");
    			}
     
    			if (j>98) j =30;
     
    			System.out.println("Annuler" + j);
     
     
    		}
     
    		prgs.cadre.dispose(); //on ferme le cadre (le chergement est fini!)
    	}
    }
    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
    import java.io.File;
    import java.util.ArrayList;
     
    public class Scan_Copie_HD{
    	// Variables
    	static ArrayList<File> listArrayDossiers = new ArrayList<File>();
    	private File[] listDossiers;
    	private boolean scanHD_Ok = false;;
    	private File[] hd_To_Scan;
    	private boolean listHDToScan = false;
     
    	int compteur = 0;
    	// Objets
    	// je le declare pour pouvoir ecrire des paramettres dans les methodes (ex : )
    	progression obj_progression;
     
    	/////////////////////////////////////////////
    	///////////////// Constructeur //////////////
    	/////////////////////////////////////////////
    	public Scan_Copie_HD(){
    		hd_To_Scan = File.listRoots();
    	}
     
    	public Scan_Copie_HD(File[] to_Scan){
    		if(to_Scan != null){
    			hd_To_Scan = to_Scan;
    			listHDToScan = true;
    		}
    		else listHDToScan = false;
     
    	}
     
    	/////////////////////////////////////////////
    	///////////////// Methodes /// //////////////
    	/////////////////////////////////////////////
     
    	public void ScanHD(){
     
    		// j'instancie l'objet pour que la fenettre apparaisse
    		obj_progression = new progression();
     
     
    		for (int i=0; i<hd_To_Scan.length; i++){
    			Scan_HDRecursive(hd_To_Scan[i]);
    		}
     
    		listDossiers = new File[listArrayDossiers.size()]; 
    		for (int i =0 ; i<listArrayDossiers.size() ; i++){ 
    			listDossiers[i] = (File)listArrayDossiers.get(i);
    		}
    		listArrayDossiers.removeAll(listArrayDossiers);
    		scanHD_Ok = true;
    	}
     
    	// Utilisee en interne par scanHD
    	private void Scan_HDRecursive(File root){
     
    		File[] liste;
    		String nomDossier;
     
    		liste = root.listFiles();
     
    		for(int i=0;i<liste.length;i++){
    			// on teste si c'est un repertoire
    			if(liste[i].isDirectory()==true)
    			{	
    				obj_progression.texte.setText(liste[i].getAbsolutePath());
    				if (compteur < 100) compteur++;
    				else compteur = 0;
    				obj_progression.progress.setValue(compteur);
     
    				// on le stock si son nom se fini par .IVI
    				nomDossier = liste[i].getName();
     
    				if(nomDossier.endsWith(".IVI")==true)
    				{
    					listArrayDossiers.add(liste[i]);
    				}
     
    				// et on regarde le contenu de ce nouveau répertoire
    				if (liste[i].listFiles() != null){
    					Scan_HDRecursive(liste[i]);
    				}
    			}
    		}
    	}
    }

  4. #4
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    Citation Envoyé par espritlune Voir le message
    bon j'avous ne pas encore bien comprendre comment transmettre des infos entre class non parent -> enfant prochaine question. lol
    Peut être faudrait-il commencer par ça ! Je n'imagine pas que l'on puisse faire fonctionner une barre de progression en environnement multitache si on ne sait pas échanger des infos entre objets.

    Je te conseille dans un premier temps de laisser tomber la barre de progression, et d'afficher un simple message au début de ton scan, style Scan en cours, et un message à la fin, style Scan terminé ; utilises pour cela un SwingWorker : tu pourras le réutiliser pour passer à ta progress bar ensuite. Tu trouveras plein d'exemples d'usage sur ce site (même dans la FAQ, je crois).

    Bon courage.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    j'y travaille serieusemenent.

    2 semaines et je pense avoir compris pas mal de fonctions en java ( merci les tutos ).

    J'admet aussi avoir des lacunes(debutant oblige). cette info m'aiderai.

    en revanche quand je trouve les infos sur un forum je ne pose plus la question : mais franchement je t'invite a tapper progressbar ou recursivite+progressbar les exemple de progressbar ne sont jamais utilisés par une fonction recursive mais toujours dans des boucles lineaire... et ca je sais faire.

    j'ai trouve, ici meme, le swingworker mais pas vraiment beaucoup d'explication et pas dans un forum... donc pour les autres et pour savoir si une autre methode que swingworker etait faisable j'ai posé concretement la question.

    http://rom.developpez.com/java-swingworker/

    pour en revenir a ma question mais il est vrai que j'ai appris pas mal de chose en parallele.
    ok le swingworker semble une (voir LA) solution. bien... mais alors autre question la fonction recursive va t elle donner les infos a chaque recursion ou seulement au moment du "depilellement"? dois je mettre juste la progressbar dans un thread diff ou plus?

  6. #6
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    L'usage du SwingWorker est exactement le même entre boucle linéaire et méthode récursive. En effet, c'est toujours le même thread qui réalise les instructions, donc les points d'échange entre threads se font pareil.

    J'imagine que ta récursivité suit l'arborescence des répertoires... Lorsque tu parcours les fichiers, que tu rencontres un répertoire, hop ! tu entres dans une nouvelle récursivité. Si tu veux mettre à jour ta barre de progression, tu fais juste un publish après chaque fichier. Quelque soit la profondeur de la récursivité le publish se fera.

    Par contre je ne vois pas trop comment tu sais le total pour dimensionner la progression ? Tu as fais une barre sans total ?

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    merci pour ton aide.

    - oui c'est vrai je voulais faire une progressbar qui tourne sur elle meme et c'est un Label dans la progressBar qui change en montrant le chemin en cours; et ceci pendant le scan pour que l'utilisateur patiente.
    Mais pour la copie je connaitrai la taille des documents. mais c'est une autre histoire

    - mon probleme c'est, maintenant que j'essaie d'integrer des interfaces: "observateur" "observable", ma progress bar qui doit observer ma class scan. le probleme est que j'instancie le scan dans ma mainframe pour y recuperer le resultat et que j'ai l'impression qu'avec cette methode je dois instancier l'objet observé dans l'objet observateur... grrrrr... je suis mal barré là...

  8. #8
    Membre émérite
    Avatar de gifffftane
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 354
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Février 2007
    Messages : 2 354
    Points : 2 582
    Points
    2 582
    Par défaut
    À ce genre de problème il n'y a qu'une solution connue : le SwingWorker.

    Tu peux en essayer d'autres ofcourses. Jusqu'à preuve du contraire, le pattern Observer/Observable n'en fait pas partie, à cause que, en général, ce pattern marche en simple thread (mais c'est pas une obligation c'est vrai), alors que le SwingWorker est prévu direct pour coordonner les threads et swing.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    Gros problème SwingWorker ne fonctionne pas sous mac et donc pas de portabilité en plus j'avais enfin résolu mon problème avec SwingWorker. alors comment faisait on avant SwingWorker? il y a surement qqun qui a une idée.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    http://java.sun.com/products/jfc/tsc...ingWorker.java

    Inclus cette classe dans ton projet et go !

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 25
    Points
    25
    Par défaut
    j'ai fais une fenetre avec une interface écouteur qui lance un thread qui renvois des infos via une interface ecoute. j'ai trouvé la soluce à la fin du cours de java sur le site . "le probleme avec l'horloge"

    pour la class java SwingWorker je la testerai une autre fois mais ca faciliterai bcp le programme. Merci a tous.

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

Discussions similaires

  1. progress bar en c++
    Par boulette&co dans le forum MFC
    Réponses: 1
    Dernier message: 23/05/2005, 08h26
  2. [ATL] Petite question sur les progress bar
    Par MrMaze dans le forum MFC
    Réponses: 1
    Dernier message: 06/05/2005, 09h40
  3. [MFC]Changer la couleur d'un progress bar
    Par Deedier dans le forum MFC
    Réponses: 1
    Dernier message: 21/04/2005, 18h39
  4. [VB.NET] Mise en place d'une progress bar
    Par Hoegaarden dans le forum Windows Forms
    Réponses: 14
    Dernier message: 19/10/2004, 09h23
  5. Progress bar au boot
    Par saibe dans le forum Administration système
    Réponses: 2
    Dernier message: 18/08/2003, 10h01

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