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 :

Rafraichissement d'un JTextArea


Sujet :

EDT/SwingWorker Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut Rafraichissement d'un JTextArea
    Bonjour,

    je crée une frame avec un JTextArea que j'alimente au fur et à mesure de l'exécution de mon programme, mais le frame ne se rafraichit pas, il reste comme sur l'image jointe.

    voici le code qui ajoute une ligne à mon JTextArea :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void addText(final String str) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    Output.append(str + newline);
                    Output.setCaretPosition(Output.getDocument().getLength());
                    //Output.revalidate();
                }
              });
        }
    qu'est ce qui cloche ?

    Merci,

    Nico
    Images attachées Images attachées  

  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,



    On dirait que tu surcharges l'EDT... Comment tu appelles cette méthode ?

    a++

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    voilà ma boucle principale :

    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
    try {
                                outputForm output = new outputForm();
                                output.setVisible(true);
                                Process myProc = Runtime.getRuntime().exec(ini.getProperty("path", "appli") + "/" +                                                                     ini.getProperty("appliFolder", "out") + "/MNTbathy.bat");                            
                                InputStream is = myProc.getInputStream();
                                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                                while ((reception = br.readLine()) != null) {                            
                                    output.addText(reception);
                                }
                                int codeRetour = myProc.waitFor();
                                myProc.destroy();                            
                            }
                            catch (IOException ex) {
                                System.err.println("DataSetChooser.DataSetChooser : " + ex.getMessage());
                            }
                            catch (InterruptedException ex) {
                                System.err.println("DataSetChooser.DataSetChooser : " + ex.getMessage());
                            }
    Nico

  4. #4
    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
    Tu effectues bien cela en dehors de l'EDT ?
    Quel est la quantité de donnée que tu reçois ? Et à quel rythme ?

    a++

    Ps : ferme les flux d'erreur et d'entrée de ton process si tu ne les utilises pas : c'est plus sûr

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    >> Tu effectues bien cela en dehors de l'EDT ?
    c'est à dire ?

    >> Quel est la quantité de donnée que tu reçois ? Et à quel rythme ?
    c'est en continu, environ 4 à 5 affichages par seconde.
    je travaille avec netbeans, si j'affiche dans la fenetre debug, ou si au lieu de rediriger l'affichage, il se fait dans la fenetre de l'invite de commande, ça se passe bien.

    >>ferme les flux d'erreur et d'entrée de ton process si tu ne les utilises pas : c'est plus sûr
    comment faire ?

    Nico

  6. #6
    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 DiverSIG Voir le message
    >> Tu effectues bien cela en dehors de l'EDT ?
    c'est à dire ?
    L'EDT correspond au thread d'affichage de Swing. Si tu effectues des traitements long ou bloquant dedans, tu empêches l'affichage de se mettre à jour et tu as ce genre de problème : il ne doit servir qu'à mettre à jour l'affichage.

    Pour vérifier si tu es dans l'EDT tu peux utiliser SwingUtilities.isEventDispatchThread().
    En général dans toutes les méthodes d'évenements tu es dans l'EDT...

    Citation Envoyé par DiverSIG Voir le message
    >>ferme les flux d'erreur et d'entrée de ton process si tu ne les utilises pas : c'est plus sûr
    comment faire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    myProc.getErrorStream().close();
    myProc.getOutputStream().close();
    a++

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    J'ai fermé les flux d'erreur et d'entrée du process et modifié ma fonction addText :
    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
    public void addText(final String str) {
     
            Runnable code = new Runnable() {
                public void run() {                
                    Output.append(str + newline);
                    Output.setCaretPosition(Output.getDocument().getLength());
                    Output.revalidate();
                }
            };
     
            if (SwingUtilities.isEventDispatchThread()) {
                code.run();
            } else {
                SwingUtilities.invokeLater(code);
            }
     
        }
    ... mais ça ne change rien !

    Nico

  8. #8
    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
    Mais ton code de lecture qui lance le process, il est exécuté où ???

    a++

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    J'ai une classe java qui implémente une boite de dialogue pour sélectionner des fichiers, et quand je clique sur un bouton OK de la boite, ça lance le traitement sur les fichiers (boucle try, voir plus haut dans le post).

    Nico

  10. #10
    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
    Oui mais ce code, il est exécuté à quel moment, et dans quel thread ?

    a++

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 423
    Points : 133
    Points
    133
    Par défaut
    dans mon main, j'affiche ma boite de dialogue de sélection, je sélectionne mes fichier, et je clique sur OK.
    les threads sont complètement nouveau pour moi, alors, est ce qu'il faut déclarer un thread dans le main avant d'afficher la boite de dialogue ? comment on fait ?

    Nico

  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 DiverSIG Voir le message
    dans mon main, j'affiche ma boite de dialogue de sélection, je sélectionne mes fichier, et je clique sur OK.
    Tu veux dire que le code que tu as donné est directement appelé depuis le main() ? Si c'est vraiment le cas tu ne devrais pas avoir de problème


    Citation Envoyé par DiverSIG Voir le message
    les threads sont complètement nouveau pour moi, alors, est ce qu'il faut déclarer un thread dans le main avant d'afficher la boite de dialogue ? comment on fait ?
    Les threads sont une notion très importante lorsqu'on développe une interface graphique. Je ne saurais que te conseiller de te documenter là dessus ainsi que sur la classe SwingWorker et le fonctionnement de l'EDT...


    a++

  13. #13
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    C'est peut-être une question idiote mais comment fait-on pour ne plus être dans l'EDT ?
    Car je rencontre +- le même problème et je débute dans les threads.

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 53
    Points : 18
    Points
    18
    Par défaut
    Magnifique ce SwingWorker

    J'ai résolu mon problème grâce à ce topic:
    http://www.developpez.net/forums/d29...interruptible/

Discussions similaires

  1. [JTextArea] problème de rafraichissement
    Par floanne dans le forum Composants
    Réponses: 5
    Dernier message: 25/02/2008, 15h46
  2. mauvais rafraichissement d'une JTextArea
    Par Nicool dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 13/11/2007, 14h26
  3. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  4. 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
  5. Timage rafraichissment
    Par Rizzla dans le forum Composants VCL
    Réponses: 5
    Dernier message: 16/09/2002, 17h08

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