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

AWT/Swing Java Discussion :

Ecriture instantané dans un JTextArea


Sujet :

AWT/Swing Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 201
    Par défaut Ecriture instantané dans un JTextArea
    Bonjour,

    J'ai une api qui possède une boite de dialogue (un JTextArea). Lorsque je lance une fonction, celle ci prend beaucoup de ressource donc il faut attendre un peu, j'écris dans le JTextArea : "traitement en cours" et à la fin de la fonction "traitement fini".

    Le problème c qu'il écrit tout à la fin.

    J'ai essayé de faire un repaint() du jTextArea avant l'appel de la fonction mais ca ne marche pas.

    Sinon je souhaiterai savoir si c'est possible de changer la couleur du texte que l'on affiche sans changer la couleur totale du JTextArea.

    Merci

    Laurent

  2. #2
    Membre Expert
    Avatar de afrikha
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    1 600
    Détails du profil
    Informations personnelles :
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 600
    Par défaut
    Toute mise à jour de l'interface graphique doit être faite depuis l'Event Dispatch Thread. Fais une recherche sur le forum, il y a plein de post le concernant.
    Concernant ton problème ,tu dois utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SwingUtilities.invokeLater(new Runnable(){public void run(){MonText.append("traitement en cours");}});
    Et pareil pour fin de traitement.
    Tu trouveras plus d'info dans la javadoc


    Mes publications
    Lisez
    Les régles du forum
    Pensez au bouton

  3. #3
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    >Toute mise à jour de l'interface graphique doit être faite depuis l'Event Dispatch Thread.

    mais non pas tout.
    y'a des exception: repaint, revalidate, paint, setBound, setText, actionPerformed....

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout dépend desquelles, certaines sont thread safe comme les setText ou getText donc pas besoin de passer par l'evt, d'autres ne le sont pas, c'est au cas par cas... cf post récent de gfx je ne sais plus où

  5. #5
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    ben c'est ec que je dis.

    t'imagine a chaque fois qu'on fait une action sur un composant on doit faire comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    ...
    JButton button = new JButton("My Button");
    button.addActionListener(new ActionListener(){
         public void actionPerformed(ActionEvent e) {
                Runnable runnable = new Runnable(){
                    public void run() {
                        // do the work 
                    }
                };
                SwingUtilities.invokeLater(runnable);
         }
    });
    ou chaque fois qu'on fais un setPreferedSize on doit passer par le SwingWorker?

    personne ne ferait du Swing et Swing serait mort depuis longtemps.
    c'est comme tu as di au cas par cas. la majorite des methode ne sont pas thread-safe en swing (au passage tout awt est thread-safe)
    mais certaines methode le sont: repaint, revalidate... faut voir dans la javadoc!

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Erreur de lecture tardive ^^

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 201
    Par défaut
    J'ai essayé ca :

    SwingUtilities.invokeLater(new Runnable(){public void run(){MonText.append("traitement en cours");}});

    et toujours aucun effet...

  8. #8
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    viscere,
    j'ai pas tous compri dans ton probleme.
    tu peut aficher ton code comme ca on te dit ce qui va pas?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 201
    Par défaut
    Voila j'utilise cette fonction pour ecrire dans mon JTextArea (avec l'heure à la fin de la ligne)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void EcrireDansConsole(final String chaine){
    		 final Date d = new Date();
    		  final SimpleDateFormat sdf = new SimpleDateFormat("H:mm:ss");
    		  jConsole.setForeground(Color.BLUE);
     
    		  SwingUtilities.invokeLater(new Runnable(){public void run(){
    			  jConsole.append(chaine+"   "+sdf.format(d)+"\n");
    			  //jConsole.repaint();
    		  }});
    	 }
    Apres je l'utilise comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     EcrireDansConsole("Chargement données Xml en cours...");
     
     
    		 conv.ConvertToXml();  // Prend du temps
     
    		 EcrireDansConsole("Chargement données Xml terminé");
    Voila

  10. #10
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    si jConsole est un JTextArea

    la methode append est thread-safe t'a pas besoin de ton SwingUtilities.
    (repaint est aussi thread-safe)

    c'est ce que je disai depuit le debut de ce message.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 201
    Par défaut
    Ok ben meme avec repaint ca marche toujours pas.

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

    Citation Envoyé par viscere
    Apres je l'utilise comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     EcrireDansConsole("Chargement données Xml en cours...");
     
     
             conv.ConvertToXml();  // Prend du temps
     
             EcrireDansConsole("Chargement données Xml terminé");
    Où appelles-tu ce code ?

    a++

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 201
    Par défaut
    Salut,

    J'appelle ce code dans une fonction qui est déclenché lorsque je choisi un fichier à partir d'un JFileChooser.

    En fait j'ai fait un convertisseur vers differents formats et dans mon api quand je clique sur Convertir vers ... il me lance le JFileChooser et une fois que je mets le nom de la cible, il exécute ce code, et c'est la que ca devrait me mettre mon premier message avant l'exécution du convertisseur.

  14. #14
    Membre Expert
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Par défaut
    Citation Envoyé par viscere
    J'appelle ce code dans une fonction qui est déclenché lorsque je choisi un fichier à partir d'un JFileChooser.
    Et je suppose que tu appelles ce JFileChooser avec un bouton ?

    Es-tu sûr de lancer ton traitement long dans un thread à part ? Parce que si tu appelles ta méthodes convertToXML dans une méthode appelée par actionPerformed, c'est le thread graphique qui va l'exécuter. Et pendant ce temps, il ne gèrera rien au niveau de l'affichage.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  15. #15
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    tu utilise pas de Thread?
    http://java.sun.com/docs/books/tutor...ads/index.html

    http://java.sun.com/docs/books/tutor...c/threads.html

    lis ce qui a sur ces deux lien.
    tu comprendra peutetre mieut.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 201
    Par défaut
    oui gzav j utilise un bouton et un actionperformed

  17. #17
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    moi je comprend pas ton probleme.
    teste ce 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    import java.awt.BorderLayout;
    import java.awt.HeadlessException;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
     
    /**
     * Created by IntelliJ IDEA.
     * User: bebe
     * Date: 13-Jun-2006
     * Time: 14:36:19
     * To change this template use File | Settings | File Templates.
     */
    public class Test extends JFrame implements ActionListener, Runnable {
     
        private JTextArea myTextArea = null;
        Thread thread = null;
     
        public Test() throws HeadlessException {
            myTextArea = new JTextArea();
            JButton myButton = new JButton("Launch action...");
            myButton.addActionListener(this);
     
            add(new JScrollPane(myTextArea));
            add(myButton, BorderLayout.SOUTH);
        }
     
        public void actionPerformed(ActionEvent e) {
            thread = new Thread(this);
            thread.start();
        }
     
        public static void main(String[] args) {
            Test t = new Test();
            t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            t.setSize(400, 300);
            t.setLocationRelativeTo(null);
            t.setVisible(true);
        }
     
        public void run() {
            try {
                myTextArea.append("Before Thread.sleep()");
                System.out.println("Thread Started");
                Thread.sleep(5000);
                System.out.println("Thread Ended");
                myTextArea.append("After Thread.sleep()");
            } catch (InterruptedException e1) {
                e1.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            }
        }
    }
    un message s'affiche dans le textarea
    apres il fais un long traitement de 5 sec
    apres il affiche un autre message dans le textarea.

  18. #18
    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
    Citation Envoyé par viscere
    J'appelle ce code dans une fonction qui est déclenché lorsque je choisi un fichier à partir d'un JFileChooser.
    C'est à dire ?

    S'il s'agit d'une méthode "événenement" (actionPerformed() lors d'un clic sur un bouton, etc...) alors le code est déjà exécuté par l'EDT. Donc si tu effectues un traitement long cela bloquera ton affichage : il ne sera plus mis à jours !!!

    Il faut que tu exécutes les traitements longs dans un autre threads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            Thread thread = new Thread() {
                public void run() {
                    EcrireDansConsole("Chargement données Xml en cours...");
                    conv.ConvertToXml();  // Prend du temps
                    EcrireDansConsole("Chargement données Xml terminé");
                }
            };
            thread.setPriority(Thread.NORM_PRIORITY);
            thread.start();
    a++

  19. #19
    Membre émérite
    Avatar de bbclone
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 537
    Par défaut
    adiGuba t'es prof?
    tu prend vraiment le temps pour tout expliquer bien toi
    bravo :-)

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 201
    Par défaut
    Nikel ca marche impec. Je vais mettre ca sur tous mes convertisseurs et ouverture de fichier.

    Je vous remercie pour vos conseils et votre patience. A plus.

    Laurent.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/01/2007, 21h14
  2. Réponses: 16
    Dernier message: 13/09/2005, 11h21
  3. Ecriture auto dans un champ edit lors de la modif d'un autre
    Par KibitO dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 05/02/2005, 18h03
  4. Comment effectuer un retour chariot dans 1 JTextarea
    Par elitost dans le forum Composants
    Réponses: 2
    Dernier message: 21/06/2004, 17h18
  5. Problème de synchronisation dans un JTextArea
    Par wutang dans le forum Composants
    Réponses: 3
    Dernier message: 21/06/2004, 15h06

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