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

Interfaces Graphiques en Java Discussion :

pbm progressMonitor - rien ne s'y affiche - pbm de thread ?


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut pbm progressMonitor - rien ne s'y affiche - pbm de thread ?
    Bonjour a tous, je suis en train de développer une petite appli d'envoi de gros fichiers, tout fonctionne jusqu'a l'affichage de mon progressMonitor... Il s'affiche... mais il n'y a rien du tout dedans !

    J'ai lu le tuto sun, mais je ne comprends pas tres bien... Je pense que c'est un probleme de thread mais je ne connai pas du tout comment tout cela fonctionne...

    Toutes les actions surviennent apres le clic sur un bouton
    mon code :
    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
    public void actionPerformed(java.awt.event.ActionEvent e) {
       //ouverture d'un JfileChooser
       //apres le choix on recupere le nom du fichier
       //on se connecte au ftp
       //si les mdp et login sont bon
       if (ftp.login("xxxxx", "xxxxx"))
       {	
    	ProgressMonitor moniteur = new ProgressMonitor(MyFrame.this,"Envoi",path,0,100);
    	moniteur.setProgress(0);
    	String command = "stor "+dossier+"/"+param;
    	//On ouvre le fichier en local
            RandomAccessFile infile = new RandomAccessFile(path, "r");
            // Converti le RandomAccessFile en un InputStream
            FileInputStream fileStream = new FileInputStream(infile.getFD());
            if (!ftp.setupDataPasv(command)) return;
    		OutputStream out = ftp.pasvSocket.getOutputStream();
    		 byte b[] = new byte[4096];
    		// Stock les donnés dans un fichier
    		 int amount;
    		 long restant = taille;
    	        while ((amount = fileStream.read(b)) > 0)
    	        {
    	        	restant = restant - amount;
    	        	long pourcentageTmp = restant*100/taille;
    	        	int pourcentage = (int)(100-pourcentageTmp);
    	        	moniteur.setProgress(pourcentage);
    	        	System.out.println(pourcentage);
                            out.write(b, 0, amount);
    	        }
    	//on ferme le flux
    	//on ferme la connexion
    	 }
    } catch (UnknownHostException e1) {
    	e1.printStackTrace();
    } catch (IOException e1) {
    	e1.printStackTrace();
    }
     
    }

  2. #2
    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,


    Ton traitement long ne doit pas être fait dans la méthode actionPerformed() car celle-ci est appellé par l'EDT. Du coup tu bloques complètement le thread d'affichage...

    Tu dois utiliser un thread supplémentaire, soit en le créant toi même soit en utilisant la classe SwingWorker (http://java.sun.com/products/jfc/tsc.../threads1.html ou pour Java 5.0 : https://swingworker.dev.java.net/).

    Plus d'info : Threads et performance avec Swing par Gfx

    a++

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut
    Merci beaucoup pour tes infos... j'ai eu l'impression d'avancer pas mal mais aie aie aie.. je tourne en bourrique...

    j'ai utilisé la classe SwingWorker et j'ai suivi l'exemple de sun pour le progressMonitor.

    j'ai donc trois fichiers...

    Traitement.java
    SwingWorker.java
    MyFrame.java

    Et la... la fenetre ne s'affiche meme plus ... mais l'upload se fait encore bien

    dans Traitement.java j'ai :
    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
    public Traitement(long taille, String dossier, String param, String path, FtpConnection ftp) throws IOException{
    		lengthOfTask = 100;
    		String command = "stor "+dossier+"/"+param;
    		//On ouvre le fichier en local
            RandomAccessFile infile = new RandomAccessFile(path, "r");
            // Converti le RandomAccessFile en un InputStream
            FileInputStream fileStream = new FileInputStream(infile.getFD());
            if (!ftp.setupDataPasv(command)) return;
    		OutputStream out = ftp.pasvSocket.getOutputStream();
    		 byte b[] = new byte[4096];
    			// Stock les donnés dans un fichier
    		 int amount;
    		 long restant = taille;
    	        while ((amount = fileStream.read(b)) > 0)
    	        {
    	        	restant = restant - amount;
    	        	long pourcentageTmp = restant*100/taille;
    	        	int pourcentage = (int)(100-pourcentageTmp);
    	        	System.out.println(pourcentage);
    	            out.write(b, 0, amount);
    	        }
    		fileStream.close();
    		ftp.pasvSocket.close();
            infile.close();
    	}
     
    	void go() {
    		pourcentage = 0;
            final SwingWorker worker = new SwingWorker() {
                public Object construct() {
                    return new ActualTask();
                }
            };
        }
     
    	 int getLengthOfTask() {
    	        return lengthOfTask;
    	    }
     
    	 	//called from ProgressBarDemo to find out how much has been done
    	    int getCurrent() {
    	        return pourcentage;
    	    }
     
    	    void stop() {
    	        pourcentage = lengthOfTask;
    	    }
     
    	    boolean done() {
    	        if (pourcentage >= lengthOfTask)
    	            return true;
    	        else
    	            return false;
    	    }
     
    	    String getMessage() {
    	        return statMessage;
    	    }
     
    	    class ActualTask {
    	        ActualTask () {
    	            //fake a long task,
    	            //make a random amount of progress every second
    	            while (pourcentage <= lengthOfTask) {
    	                try {
    	                    Thread.sleep(1000); //sleep for a second
    	                    statMessage = "Completed " + pourcentage +
    	                                  " out of " + lengthOfTask + ".";
    	                } catch (InterruptedException e) {
    	                }
    	            }
    	        }
    	    }
    et j'ai refait mon MyFrame comme dans l'exemple :

    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
     
     
    	class TimerListener implements ActionListener {
            public void actionPerformed(ActionEvent evt) {
                if (moniteur.isCanceled()) {
                    moniteur.close();
                    task.stop();
                    timer.stop();
                } else {
                    moniteur.setNote(task.getMessage());
                    moniteur.setProgress(task.getCurrent());
                }
            }
        }
     
     
    //Dans le bouton
    public void actionPerformed(java.awt.event.ActionEvent e) {
     
    					//ouverture d'un JfileChooser
       //apres le choix on recupere le nom du fichier
       //on se connecte au ftp
       //si les mdp et login sont bon
       if (ftp.login("xxxxx", "xxxxx")){	
    								task = new Traitement(taille,dossier,param,path,ftp);
    								moniteur = new ProgressMonitor(MyFrame.this,"Envoi",path,0,100);
    								moniteur.setProgress(0);
    								timer = new Timer(1000, new TimerListener());
    								task.go();
    					            timer.start();
     
    							}
    						} catch (UnknownHostException e1) {
    							e1.printStackTrace();
    						} catch (IOException e1) {
                                                            e1.printStackTrace();
    						}
     
    				}
    			});
    		}
    		return bouton;
    	}
    je patauge vraiment... :'(

  4. #4
    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
    Ton traitement long est effectué dans le constructeur de Traitement, qui est appellé depuis l'EDT...

    Ce code devrait se trouver dans la méthode construct() de ta classe SwingWorker !

    Actuellement ton SwingWorker ne sert à rien...

    a++

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut
    argh... j'ai rien compris alors :p... bon je vais reprendre çà...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut
    La méthode construct est un abstract object... je ne peux pas mettre de corps a l'intérieur... je fais comment???

    J'ai testé de mettre le traitement long dans ActualTask...
    mais çà n'a pas pas l'air de fonctionner non plus

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 12
    Par défaut
    je rame vraiment... je ne comprends rien... c'est vraiment pas marrant ...

    Là mon traitement ne se fait meme plus... :s... et je ne vois pas du tout ou le mettre en fait :/

    une suggestion?

    N'auriez vous pas un squelette déjà tout fait pour que je crée mon deuxieme thread moi meme, sans utiliser SwingWorker (ou bien un squelette qui utilise deja SwingWorker), çà me débolquerai vraiment :s. merci

Discussions similaires

  1. Remplacer un caractère et l'afficher (dans un Thread)
    Par Aymenkn dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 04/01/2015, 13h38
  2. [MySQL] Après requete SQL, rien ne veut pas afficher
    Par robinmaret dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 23/09/2009, 14h47
  3. [PHP 4] [POO] objet rempli mais rien quand je l'affiche
    Par allserv dans le forum Langage
    Réponses: 8
    Dernier message: 15/04/2009, 23h27
  4. [WD9] Table affiche dans un thread
    Par gbzmt dans le forum WinDev
    Réponses: 2
    Dernier message: 08/08/2008, 17h13
  5. pbm vb6 impossible d'afficher modalement
    Par rezgui_fawzi dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 04/11/2007, 22h48

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