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 :

Problème de rafraichissement .. [FAQ]


Sujet :

Interfaces Graphiques en Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Problème de rafraichissement ..
    Bonjour.

    Mon IHM contient une console (JTextArea où sont redirigié tous les "system.out.println").

    J'ouvre un fichier grace à un JFileChooser et j'effectue directement unopération traitment (d'une autre clases) qui dure un certain temps.

    Le problème est que normament le JFile Chooser doit se fermer et on devrait voir les afficher des commentaires sur le traitement en question dans la console en temps réel. Or la fenetre du JFileChooser de vient toute grise et se "bloque" devant mon IHM. Elle disparait à la fin de mon traitement et mes commentaire sur celui ci arrivent d'une traite dans la console.

    Comment aire pour palier à ce problème ?

    Merci d'avance !

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Tu dois surement effectuer la lecture du fichier dans l'EDT, ce qui l'empêche de mettre à jour l'affichage. Tu dois utiliser un autre thread, ou mieux, la classe SwingWorker (pas encore standard)

    Un peu de lecture sur une des bases de la programmation AWT/Swing : Threads et performance avec Swing

    a++

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Il me semblait bien que c'était un problème de thread.

    Merci pour ces informations.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Quel seraient les problèmes si j'utilise SwingWorker ?

    A quoi doit je faire attention?

  5. #5
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Adrien22
    Quel seraient les problèmes si j'utilise SwingWorker ?
    Ben normalement SwingWorker est là pour t'éviter les problèmes, en séparant bien les tâches "lourdes" à exécuter dans un thread séparé, et les tâches de mises à jour de l'affichage à exécuter dans l'EDT...


    Quel est ta version de Java ???

    a++

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par adiGuba
    Quel est ta version de Java ???
    j2sdk1.4.2_09

    Les problème dont je parlais, était à propos de cela

    Apparement cette classe est disponible sur le site de SUN.

    (Elle est incluse dans J2EE sinon ?)

  7. #7
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Je ne pense pas qu'elle soit incluse dans J2EE, car J2EE n'a pas grand chose à voir avec Swing...

    Tu trouvera cette classe sur swinglabs
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Oui je l'ai trouvé.

    @adiGuba: merci j'ai appris énormement de chose gràce a toi

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Adrien22
    Apparement cette classe est disponible sur le site de SUN.
    Oui c'est une très ancienne classe, proposé dans un tutoriel Swing de 1998 : http://java.sun.com/products/jfc/tsc.../threads1.html

    Elle a depuis énormement évolué pour prendre en compte les nouveautés de Java 5.0 (Generics et API de concurrence entre autres) : https://swingworker.dev.java.net/

    C'est cette dernière version qui sera intégré en standard dans Java 6.0...



    Comme tu n'utilises que Java 1.4 tu ne peut pas utilisé la dernière version, mais seulement la première, que tu peux télécharger ici : http://java.sun.com/products/jfc/tsc...ingWorker.java

    Il te suffit de copier cette classe dans un de tes packages. A la rigueur tu peux la modifier en déclarant toutes les méthodes en final (sauf construct() et finished()), ce qui pourrait t'éviter quelques erreurs...


    Ensuite, lorsque tu as un traitement long a exécuté, tu crées un nouvel objet héritant de SwingWorker, dont tu peux éventuellement utilisé le constructeur pour passer des paramètres.

    Tu redéfinis la méthode construct() (obligatoire), afin d'y effectuer ton traitement. A la fin de cette méhode tu peux eventuellement retourner un objet en résultat.

    Enfin tu peux également redéfinir la méthode finished(), qui sera appellé à la fin du traitement dans le thread de l'EDT (pour mettre à jours l'affichage donc).

    Une fois que ton SwingWorker est créé, il suffit d'appeller la méthode start() pour démarrer le traitement en tâche de fond...


    Par 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
        public void actionPerformed(ActionEvent e) {
     
            // Création du SwingWorker
            SwingWorker worker = new SwingWorker() {
     
                // Cette méthode est appellé dans un thread séparé
                public Object construct() {
                    // Traitement long ICI
     
                    return unObjectResultat;                
                }
     
     
                // Cette méthode est appellé dans l'EDT
                public void finished() {
     
                    // On récupère le résultat de construct()
                    LeTypeReel obj = (LeTypeReel) getValue();
     
                    // Modification de l'interface graphique ICI
     
                }
            };
     
            // Démarrage de la tâche
            worker.start();
     
        }

    Le seul cas qui n'est pas géré, c'et si tu as besoin de modifier l'affichage pendant ton traitement long, dans ce cas il faudra faire appel à SwingUtilities.invokeLater()... (ce cas est géré dans la dernière version via les méthode publish() et process()).



    Citation Envoyé par Adrien22
    (Elle est incluse dans J2EE sinon ?)
    Non. J2EE c'est pour des applications serveurs. Il n'y a pas de Swing ni de GUI en général...

    a++

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Encore une question :

    Un "traitement long" peut être via l'appel d'une fonction d'une autre classe ?


    edit:je suis dans le cas où l'affichage change en temps réel il me semble ...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Ben ça marche nickel !!!

    Impressionant je gagne au moin 20 secondes sur le traitement !!!!!

    Merci beaucoup !!!!!!

  12. #12
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Adrien22
    Impressionant je gagne au moin 20 secondes sur le traitement !!!!!
    Heu... Le traitement en lui même ne devrait pas être plus rapide...

    Par contre l'interface semble plus réactive car elle n'est plus figé

    Citation Envoyé par Adrien22
    edit:je suis dans le cas où l'affichage change en temps réel il me semble ...
    Alors il va falloir joué avec des invokeLater()...
    Que dois-tu mettre à jour pendant le traitement ???

    a++

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    OK pour les 20 secondes gagné. ^^'

    Pour le "édit" en fait je ne met rien jour juste comme j'ai redirigé la sortie de mon appli vers un JTextArea ça a l'air de se faire machinallement (pas besoin de MAJ apparement).

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Oups. apparement le traitment long n'a pas l'air de s'arretter ...

    Voila 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
     
    public void actionPerformed(java.awt.event.ActionEvent e) {
    	FileChooser fc = new FileChooser ();
    	if(fc.show("Load")==true){
    		File selectedFile = fc.getSelectedFile();
    		currentPath = selectedFile.getPath();
    		 SwingWorker worker = new SwingWorker() {
    		             // Cette méthode est appellé dans un thread séparé
    	             public Object construct() {
    			 // Traitement long ICI
    				loadCaptureInfos(currentPath);
    				return "OK";                
    			}
    			// Cette méthode est appellé dans l'EDT
    		    public void finished() {
    				  // On récupère le résultat de construct()
    				String obj = (String) getValue();
    			         if(obj.equals("OK")){
                                          System.out.println("\nGeneration ended.");
    				 }
    				 // Modification de l'interface graphique ICI
     
    				 }
    		 };					         
    		 // Démarrage de la tâche
    		worker.start();
    		}
    		return;
    		}
    	});

    Le message de fin n'apparait jamais ...

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Tout est OK

    Merci encore.

    Problème résolu.

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

Discussions similaires

  1. [MFC] Problème de rafraichissement,
    Par pykoon dans le forum MFC
    Réponses: 1
    Dernier message: 27/04/2005, 07h21
  2. Problème de rafraichissement.
    Par beyo dans le forum ASP
    Réponses: 5
    Dernier message: 18/03/2005, 16h27
  3. [SWING] Problème de rafraichissement
    Par david71 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 24/05/2004, 15h38
  4. [JTree]problème de rafraichissement
    Par peppena dans le forum Composants
    Réponses: 9
    Dernier message: 20/01/2004, 14h06
  5. Toujours un problème de rafraichissement de DBGrid
    Par tripper.dim dans le forum C++Builder
    Réponses: 4
    Dernier message: 09/12/2002, 13h15

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